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

时间:2018-04-16 15:49:44

标签: php regex non-latin

我将这个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;
}

2 个答案:

答案 0 :(得分:1)

你需要使用西班牙语字母的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 :(得分:0)

要详细了解 Unicode正则表达式,请参阅this article

tar -tvf <tar-file> -R | awk ' BEGIN{ getline; f=$8; s=$5; } { offset = int($2) * 512 - and((s+511), -512) print offset,s,f; f=$8; s=$5; }' \p{L}匹配任何语言的任何类型的信件。

要仅匹配西里尔字符,请使用\p{Letter}

由于西里尔字符不是标准的ASCII字符,因此必须使用\p{Cyrillic}标志/修饰符,因此正则表达式将根据需要识别Unicode字符。

在处理unicode字符时,请务必使用u代替mb_strtolower

因为您将所有字符转换为小写,所以您不必使用strtolower正则表达式/修饰符。

以下 PHP 代码应该适合您:

i

此外,请注意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; } 匹配所有Cyrillic Supplementary characters\p{InCyrillic_Supplementary}匹配所有non-Supplementary Cyrillic characters