你可以尝试这个:
preg_replace('~[^\p{L}\p{N}]++~u', ' ', $string);
\p{L}
代表所有字母字符(无论是什么字母表)。
\p{N}
代表数字。
使用 u 修饰符,主字符串中的字符将被视为 Unicode 字符。
或者是这个:
preg_replace('~\P{Xan}++~u', ' ', $string);
\p{Xan}
包含 Unicode 字母和数字。
\P{Xan}
包含除 Unicode 字母和数字之外的所有内容。(注意,它还包括空格,你可以使用 ~[^\p{Xan}\s]++~u
保留空格。)
如果您想要更具体的允许字母集合,您必须在Unicode 表中用范围替换 \p{L}
。
示例:
preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string);
为什么在这里使用所有权量词(++)?
~\P{Xan}+~u
会给您与~\P{Xan}++~u
相同的结果。区别在于,在第一个正则表达式中,引擎记录了每个回溯位置(我们不需要),而在第二个正则表达式中,它没有记录(就像原子组一样)。结果是获得了一点性能提升。
我认为在可能的情况下使用所有权量词和原子组是一个好习惯。
然而,PCRE正则表达式引擎会自动将显而易见的情况下的量词变为所有权量词(例如:a+b
=> a++b
),除非使用选项PCRE_NO_AUTO_POSSESS进行编译。(http://www.pcre.org/pcre.txt)
关于所有权量词和原子组的更多信息请点击此处(所有权量词)和此处(原子组)或点击此处
\X
。 - Wrikken[^a-zÀ-ÖØ-öÿŸ\d]++ui', ' ', $string); 但我想知道如何在字符串中添加“_”下划线和“-”连字符以保留。 - MZaragoza^
,只有不在该类中的字符才会被匹配和替换)。所以可以使用~[^a-zÀ-ÖØ-öÿŸ\d_-]++~ui
或~[^\p{L}\p{N}_-]++~u
或~[^\p{Xan}_-]++~u
。 - Casimir et Hippolyte\p{alnum}
(表示所有Unicode字母和数字)和类交集:[\P{alnum}&&[^_-]]
。 - Casimir et Hippolyte