删除所有特殊字符,但不删除非拉丁字符



我正在将这个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}匹配所有非西里尔文补充字符。

相关内容

  • 没有找到相关文章