你可以试试这个:
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 table\p{L}
中的范围替换。
例子:
preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string);
为什么在这里使用所有格量词(++)?
~\P{Xan}+~u
会给你同样的结果~\P{Xan}++~u
。这里的区别在于,在第一个引擎记录每个回溯位置(我们不需要),而在第二个它不记录(如在原子组中)。结果是很小的业绩利润。
我认为在可能的情况下使用所有格量词和原子组是一个好习惯。
a+b
但是,PCRE 正则表达式引擎在明显的情况下(例如: => )自动使量词具有所有格,a++b
除非 PCRE 模块已使用选项 PCRE_NO_AUTO_POSSESS 编译。( http://www.pcre.org/pcre.txt )
有关所有格量词和原子组的更多信息here(占有量词)和here(原子组)或here