在 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.

中失去了它的特殊含义