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

Posted

技术标签:

【中文标题】PHP 正则表达式 - 删除所有非字母数字字符【英文标题】:PHP Regular expression - Remove all non-alphanumeric characters 【发布时间】:2013-05-01 20:59:45 【问题描述】:

我使用 php

我的字符串可能是这样的

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

问题

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

- + : _ ?

我已经阅读了很多关于它的主题,但它们不支持其他语言,比如这个:

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

要求

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

【问题讨论】:

【参考方案1】:

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

那就试试吧:

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

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

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

【讨论】:

【参考方案2】:

您是否在寻找\W

类似:

/[\W_]*/

匹配所有非字母数字字符和下划线。

\w 匹配所有单词字符(字母、数字、下划线)

\W 匹配不在\w 中的任何内容。

因此,\W 匹配任何非字母数字字符,并且您添加下划线,因为 \W 不匹配下划线。

编辑:这使您的代码行变为:

preg_replace("/[\W_]*/", ' ', $string);

' ' 表示所有匹配的字符(不是字母也不是数字)都将变成空格。

重新编辑:您可能还想使用另一个 preg_replace 来删除所有连续的空格并将它们替换为单个空格,否则您最终会得到:

This is a string test width     and some  ber strange characters   like this 

你可以使用:

preg_replace("/\s+/", ' ', $string);

如果有的话,最后修剪开始和结束的空格。

【讨论】:

【参考方案3】:

你可以试试这个:

preg_replace('~[^\pL\pN]++~u', ' ', $string);

\pL 代表所有字母字符(无论是什么字母)。

\pN 代表数字。

带有 u 修饰符的主题字符串被视为 unicode 字符。

或者这个:

preg_replace('~\PXan++~u', ' ', $string);

\pXan 包含 unicode 字母和数字。

\PXan 包含所有非 unicode 字母和数字。 (请注意,它也包含空格,您可以使用 ~[^\pXan\s]++~u 保留)

如果您想要一组更具体的允许字母,您必须将 \pL 替换为 unicode table 中的范围。

例子:

preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string);

为什么在这里使用所有格量词 (++)?

~\PXan+~u 会给你与~\PXan++~u 相同的结果。这里的区别在于,在第一个引擎记录每个回溯位置(我们不需要),而在第二个它不记录(如在原子组中)。结果是很小的业绩利润。

我认为在可能的情况下使用所有格量词和原子组是一种很好的做法。

但是,PCRE 正则表达式引擎在明显的情况下会自动使量词具有所有格(例如:a+b => a++b),除非 PCRE 模块已使用选项 PCRE_NO_AUTO_POSSESS 编译。 (http://www.pcre.org/pcre.txt)

有关所有格量词和原子组here (possessive quantifiers) 和here (atomic groups) 或here 的更多信息

【讨论】:

这个。但是,根据字符串的不同,可能需要包含\X @CasimiretHippolyte 感谢这篇文章,它帮助我分配了我喜欢你的正则表达式 preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string );但我想知道如何在字符串中添加“_”下划线和“-”连字符以保留 @MoisesZaragoza:如果要保留这些字符,只需将它们添加到字符类,因为它是负字符类(由于开头^,只有字符没有类中存在的匹配和替换)。所以~[^a-zÀ-ÖØ-öÿŸ\d_-]++~ui~[^\pL\pN_-]++~u~[^\pXan_-]++~u @MoisesZaragoza:请注意,对于 Ruby,您可以使用 \palnum(用于所有 unicode 字母和数字)和类交集:[\Palnum&&[^_-]]【参考方案4】:

\pxx 是你要找的,我相信,see here

那么,试试吧:

preg_replace("/\PL+/u", ' ', $string);

【讨论】:

但这不是用空格替换了 OP 想要保留的所有字母字符吗? 这不应该替换任何字母字符,不(注意大写P)。 哦,对了。但是,数字字符呢?它们是否包含在L 中?我不确定文档中的“修饰符字母”或“其他字母”是什么意思。

以上是关于PHP 正则表达式 - 删除所有非字母数字字符的主要内容,如果未能解决你的问题,请参考以下文章

删除批处理变量中的非字母数字字符

正则表达式,用于包含至少8个字符和至少1个非字母数字字符的密码

包含至少 8 个字符和至少 1 个非字母数字字符的密码的正则表达式

从字符串中删除非字母数字字符(包括 ß、Ê 等)

php-正则表达式

强烈推荐!Python 这个宝藏库 re 正则匹配