我使用PHP。
我的字符串可能如下所示
This is a string-test width åäö and some über+strange characters: _like this?
问题
有没有办法删除非字母数字字符并用空格替换它们?以下是一些非字母数字字符:
我已经阅读了很多关于它的帖子,但是他们不支持其他语言,比如这个:
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
要求
答案 0 :(得分:29)
你可以试试这个:
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
)
如果您想要一组更具体的允许字母,则必须将\p{L}
替换为unicode table中的范围。
示例:
preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string);
为什么在这里使用占有量词(++)?
~\P{Xan}+~u
会为您提供与~\P{Xan}++~u
相同的结果。这里的区别在于,在第一个引擎记录每个回溯位置(我们不需要),而在第二个时它没有(如在原子组中)。结果是小的业绩利润。
我认为在可能的情况下使用占有量词和原子群是一种很好的做法。
但是,PCRE正则表达式引擎会在明显的情况下自动生成量词占用(例如:a+b
=> a++b
),除非PCRE模块已使用选项PCRE_NO_AUTO_POSSESS进行编译。 (http://www.pcre.org/pcre.txt)
有关占有量词和原子群的更多信息here (possessive quantifiers)和here (atomic groups)或here
答案 1 :(得分:3)
您是否正在寻找\W
?
类似的东西:
/[\W_]*/
匹配所有非字母数字字符和下划线。
\w
匹配所有单词字符(字母,数字,下划线)
\W
匹配\w
以外的任何内容。
因此,\W
匹配任何非字母数字字符,并添加下划线,因为\W
与下划线不匹配。
编辑:这使您的代码行变为:
preg_replace("/[\W_]*/", ' ', $string);
' '
表示所有匹配的字符(非字母而非数字)将变为空格。
reEDIT:您可能还想使用另一个preg_replace
删除所有连续的空格,并用一个空格替换它们,否则您将最终得到:
This is a string test width and some ber strange characters like this
您可以使用:
preg_replace("/\s+/", ' ', $string);
最后修剪起始和结束空格(如果有的话)。
答案 2 :(得分:1)
我不完全确定您正在使用哪种正则表达式。但是,POSIX正则表达式允许您表示按字母顺序排列的类,其中[:alpha:]表示任何字母字符。
所以试试:
preg_replace("/[^[:alpha:]0-9 ]/", '', $string);
实际上,我忘记了[:alnum:] - 这使得它变得更简单:
preg_replace("/[^[:alnum:] ]/", '', $string);
答案 3 :(得分:1)