多语言字符串中去除特殊字符的正则表达式

5
最常用的用于去除特殊字符的正则表达式似乎是这个 -
preg_replace( '/[^a-zA-Z0-9]/', '', $string );

问题在于它也会删除非英语字符。

是否有一个正则表达式可以删除所有语言的特殊字符?或者唯一的解决方案是显式匹配每个特殊字符并将其删除?

2个回答

5
您可以使用以下内容代替:
preg_replace('/\P{Xan}+/u', '', $string );

\p{Xan}表示Unicode表中任何字母数字。
\P{Xan}表示非数字或字母的所有内容。它是[^\p{Xan}]的缩写。


谢谢!我明白\P是一个没有Unicode属性的字符。你能解释一下{Xan}吗? - A.Jesin
1
@A.Jesin:大写字母P仅用于否定Unicode字符类。例如,\p{Latin}是所有拉丁字母的字符类(如[a-zA-Z]但包括重音符号)。如果您想否定它以获得所有非拉丁字母,则编写\P{Latin} - Casimir et Hippolyte
3
您可以在此文档中找到所有的Unicode字符类别:http://pcre.org/pcre.txt。 - Casimir et Hippolyte

3

您可以使用:

$string = preg_replace( '/[^\p{L}\p{N}]+/u', '', $string );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接