PHP正则表达式-删除所有非字母数字字符


PHP Regular expression - Remove all non-alphanumeric characters

我用的是PHP

我的字符串可以像这样

This is a string-test width åäö and some über+strange characters: _like this?

是否有一种方法可以删除非字母数字字符并用空格替换它们?以下是一些非字母数字字符:

  • -
  • +
  • :
  • _
  • ?

我读了很多关于它的帖子,但是他们不支持其他语言,比如这个:

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

  • 我的非字母字符列表可能不完整。
  • 我的内容包含不同语言的字符,如åäöü。可能更多。
  • 非字母数字字符应替换为空格。否则这两个词就会粘在一起。

你可以试试:

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相同的结果。这里的不同之处在于,在第一种情况下,引擎记录每个回溯位置(我们不需要),而在第二种情况下,它不记录每个回溯位置(就像在原子组中一样)。结果是一个小的性能利润。

我认为在可能的情况下使用所有格量词和原子群是一个很好的练习。

然而,在明显的情况下(例如:a+b => a++b), PCRE regex引擎会自动使量词为所有格,除非PCRE模块已经使用选项pcre_no_auto_拥有进行编译。(http://www.pcre.org/pcre.txt)

有关所有格量词和原子群的更多信息请参阅此处(所有格量词)和此处(原子群)或此处

您是否正在寻找'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);

我不完全确定您使用的是哪种正则表达式。但是,POSIX正则表达式允许您表示字母类,其中[:alpha:]表示任何字母字符。

所以尝试:

preg_replace("/[^[:alpha:]0-9 ]/", '', $string);

实际上,我忘记了[:alnum:] -这使它更简单:

preg_replace("/[^[:alnum:] ]/", '', $string);

'p{xx}就是你要找的,我相信,看这里

所以,尝试:

preg_replace("/'P{L}+/u", ' ', $string);