在 PHP 7.4.* 中,使用 preg_replace 保留空格、拉丁字符和西里尔字符的正确方法是什么?
What is the correct way of keeping spaces, Latin and Cyrillic characters with preg_replace, in PHP 7.4.*?
考虑以下因素。
function cleanText($text) {
return preg_replace("/[^0-9\p{Latin}\p{Cyrillic}\.\-\_\s+]+/u","",$text);
}
$tmp = "intro_|_text Mary had a little lamb, we'll be right back 123456789 абвгдђежзијкл ,./'* αβγδε šđ";
echo cleanText($tmp);
预期输出为(如 phpfiddle.org 和 repl.it 所示):
intro__text Mary had a little lamb well be right back 123456789 абвгдђежзијкл . šđ
然而,Xampp 与 PHP 7.4.8 和 this site return 以下(后者与每个 PHP 7.4.*):
aMaryhadalittlelambwellberightback123456789абнллклл.šđ
如果删除 \p{Latin}\p{Cyrillic}
,空格将保留。在 preg_replace
中同时包含单个空格和特定字母表的正确方法是什么?
您可以使用 \p{L}
而不是 Unicode 属性,其支持似乎已在此处中断。
你可以使用
preg_replace('/[^0-9\p{L}\s._+-]+/u', '', $text)
还要注意,字符class的末尾使用-
比较安全,以免被转义。 .
和 _
也不需要转义, _
是一个单词 char 而 .
在字符 class.
中失去了它的特殊含义
考虑以下因素。
function cleanText($text) {
return preg_replace("/[^0-9\p{Latin}\p{Cyrillic}\.\-\_\s+]+/u","",$text);
}
$tmp = "intro_|_text Mary had a little lamb, we'll be right back 123456789 абвгдђежзијкл ,./'* αβγδε šđ";
echo cleanText($tmp);
预期输出为(如 phpfiddle.org 和 repl.it 所示):
intro__text Mary had a little lamb well be right back 123456789 абвгдђежзијкл . šđ
然而,Xampp 与 PHP 7.4.8 和 this site return 以下(后者与每个 PHP 7.4.*):
aMaryhadalittlelambwellberightback123456789абнллклл.šđ
如果删除 \p{Latin}\p{Cyrillic}
,空格将保留。在 preg_replace
中同时包含单个空格和特定字母表的正确方法是什么?
您可以使用 \p{L}
而不是 Unicode 属性,其支持似乎已在此处中断。
你可以使用
preg_replace('/[^0-9\p{L}\s._+-]+/u', '', $text)
还要注意,字符class的末尾使用-
比较安全,以免被转义。 .
和 _
也不需要转义, _
是一个单词 char 而 .
在字符 class.