繁体   English   中英

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

如果您想要一组更具体的允许字母,则必须将\\p{L}替换为unicode表中的范围。

例:

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

关于占有量词和原子群的更多信息(占有量词)这里(原子团)这里

你也许正在寻找\\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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM