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个非字母数字字符的密码