Удалить все специальные символы, но не латинские символы

Я использую эту функцию PHP для SEO URL. Он хорошо работает с латинскими словами, но мои URL-адреса на кириллице. Это регулярное выражение — /[^a-z0-9_\s-]/ не работает с кириллическими символами, пожалуйста, помогите мне заставить его работать с нелатинскими символами.

function seoUrl($string) {
// Lower case everything
$string = strtolower($string);
// Make alphanumeric (removes all other characters)
$string = preg_replace('/[^a-z0-9_\s-]/', '', $string);
// Clean up multiple dashes or whitespaces
$string = preg_replace('/[\s-]+/', ' ', $string);
// Convert whitespaces and underscore to dash
$string = preg_replace('/[\s_]/', '-', $string);
return $string;
}

0

Решение

Вам нужно использовать скрипт Unicode для кириллицы, который, к счастью, поддерживает PHP PCRE, используя \p{Cyrillic}, Кроме того, вы должны установить u (Unicode) флаг, чтобы предсказать поведение двигателя. Вам также может понадобиться i флаг включения нечувствительности к регистру, например A-Z:

~[^\p{Cyrillic}a-z0-9_\s-]~ui

Вам не нужно дважды бежать \s,

Код PHP:

preg_replace('~[^\p{Cyrillic}a-z0-9_\s-]+~ui', '', $string);
1

Другие решения

Чтобы узнать больше о Юникод Регулярные выражения увидеть Эта статья.

\p{L} или же \p{Letter} соответствует любому виду букв на любом языке.

Чтобы соответствовать только кириллическим символам, используйте \p{Cyrillic}

Поскольку кириллические символы не являются стандартными символами ASCII, вы должны использовать u флаг / модификатор, поэтому регулярное выражение будет распознавать символы Юникода по мере необходимости.

Обязательно используйте mb_strtolower вместо strtolower, так как вы работаете с символами Unicode.

Поскольку вы переводите все символы в нижний регистр, вам не нужно использовать i флаг / модификатор регулярного выражения.


Следующие PHP код должен работать на вас:

function seoUrl($string) {
// Lower case everything
$string = mb_strtolower($string);
// Make alphanumeric (removes all other characters)
$string = preg_replace('/[^\p{Cyrillic}a-z0-9\s_-]+/u', '', $string);
// Clean up multiple dashes or whitespaces
$string = preg_replace('/[\s-]+/', ' ', $string);
// Convert whitespaces and underscore to dash
$string = preg_replace('/[\s_]/', '-', $string);
return $string;
}

Кроме того, обратите внимание, что \p{InCyrillic_Supplementary} соответствует всем Дополнительные символы кириллицы а также \p{InCyrillic} соответствует всем не дополнительные символы кириллицы.

0

По вопросам рекламы [email protected]