首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP正则表达式-删除所有非字母数字字符

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

Stack Overflow用户
提问于 2013-05-07 19:26:01
回答 4查看 20.4K关注 0票数 12

我使用PHP。

我的字符串看起来像这个

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

问题

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

  • -
  • +
  • _

我读过很多关于它的文章,但它们不支持其他语言,比如:

代码语言:javascript
运行
复制
preg_replace("/[^A-Za-z0-9 ]/", '', $string);

Requirements

  • 我的无字母字符列表可能不完整。
  • 我的内容包含不同语言的字符,比如。可能还会更多。
  • 非字母数字字符应替换为空格。否则这个词就会彼此粘合在一起。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-07 19:33:29

你可以试试这个:

代码语言:javascript
运行
复制
preg_replace('~[^\p{L}\p{N}]++~u', ' ', $string);

\p{L}代表所有的字母字符(不管是什么字母)。

\p{N}代表数字。

使用u修饰符,主题字符串的字符被视为unicode字符。

或者这个:

代码语言:javascript
运行
复制
preg_replace('~\P{Xan}++~u', ' ', $string);

\p{Xan}包含unicode字母和数字。

\P{Xan}包含所有不是unicode字母和数字的内容。(小心,它也包含空白,您可以在~[^\p{Xan}\s]++~u中保留)

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

示例:

代码语言:javascript
运行
复制
preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string);

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

~\P{Xan}+~u将给出与~\P{Xan}++~u相同的结果。这里的区别是,在第一个引擎记录每个回溯位置(我们不需要),而在第二个引擎没有(就像在一个原子组)。其结果是一个很小的表现利润。

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

但是,PCRE regex引擎在明显的情况下(例如:a+b => a++b)会自动使量化器具有所有物,除非PCRE模块已经使用选项PCRE_NO_AUTO_POSSESS进行编译。(http://www.pcre.org/pcre.txt)

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

票数 32
EN

Stack Overflow用户

发布于 2013-05-07 19:31:06

你是不是在找\W

类似于:

代码语言:javascript
运行
复制
/[\W_]*/

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

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

\W匹配\w中没有的任何内容。

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

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

代码语言:javascript
运行
复制
preg_replace("/[\W_]*/", ' ', $string);

' '意味着所有匹配的字符(不是字母和数字)都将变成空白。

reEDIT:您可能还需要使用另一个preg_replace来删除所有连续空格,并将它们替换为单个空格,否则您将得到以下结果:

代码语言:javascript
运行
复制
This is a string test width     and some  ber strange characters   like this 

您可以使用:

代码语言:javascript
运行
复制
preg_replace("/\s+/", ' ', $string);

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

票数 3
EN

Stack Overflow用户

发布于 2013-05-07 19:30:58

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

所以试着:

代码语言:javascript
运行
复制
preg_replace("/[^[:alpha:]0-9 ]/", '', $string);

实际上,我忘了:alnum:-这让它变得更简单:

代码语言:javascript
运行
复制
preg_replace("/[^[:alnum:] ]/", '', $string);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16426976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档