我正在将这个PHP函数用于SEO网址。它适用于拉丁词,但我的网址是西里尔文。这个正则表达式 - /[^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);
要了解有关 Unicode 正则表达式的更多信息,请参阅本文。
p{L}
或p{Letter}
匹配来自任何语言的任何类型的字母。
要仅匹配西里尔字符,请使用p{Cyrillic}
由于西里尔字符不是标准的 ASCII 字符,因此您必须使用u
标志/修饰符,因此正则表达式将根据需要识别 Unicode 字符。
请务必使用 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-9s_-]+/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}
匹配所有非西里尔文补充字符。