Я использую эту функцию 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;
}
Вам нужно использовать скрипт 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);
Чтобы узнать больше о Юникод Регулярные выражения увидеть Эта статья.
\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}
соответствует всем не дополнительные символы кириллицы.