如何在PHP中编写正则表达式以删除特殊字符?

14

我对PHP还很陌生,但我注意到有很多不同的方法来处理正则表达式。

这是我目前正在使用的:

$replace = array(" ",".",",","'","@");
$newString = str_replace($replace,"_",$join);

$join = "the original string i'm parsing through";

我想删除除了a-z、A-Z或0-9以外的所有字符。我正在寻找上述操作的反向函数。下面是写它的伪代码:

如果$join中的字符不等于a-z、A-Z或0-9,则将$join中的字符更改为"_"

3个回答

46
$newString = preg_replace('/[^a-z0-9]/i', '_', $join);

这个应该能解决问题。


2
嗨,antennen,感谢回复!这个区分大小写吗?它会接受大写字母吗?谢谢,Ben。 - Ben McRae
2
这就是末尾的“i”的作用 - 不区分大小写。 - ceejayoz
请注意,此正则表达式将连续出现的非字母数字字符替换为单个“_”。因此,“@@@”将被替换为“_”,而不是“___”。如果您不想要这种行为,请删除“+”。 - mpen
很好,你指出了这一点,我通常使用相同的方法丢弃字符。加号只是老习惯了。编辑后,因为它没有复制原帖中所述的行为。 - runfalk
谢谢Mark,加法符号实际上非常适合我想要实现的目标 :) - Ben McRae
显示剩余2条评论

13

除了 a-z、A-Z 和 0-9 之外的任何内容,其正则表达式为:

preg_replace('/[^a-zA-Z0-9]/', "_", $join);

这被称为否定字符类


9
最简单的方法是这样的:
preg_replace('/\W/', '_', $join);

\W是非单词字符组。单词字符是a-z、A-Z、0-9和_。\W匹配之前未提到的所有内容*。

编辑:preg使用Perl的正则表达式,文档在perlman perlre中记录。

*编辑2:这假定C或其中一个英语区域设置。其他区域设置可能在单词字符类中有重音字母。Unicode区域设置只会考虑代码点128以下的字符为字符。


由于本地化的原因,它可能包含除a-z以外的其他字符。 - runfalk
其实,那是一个很好的观点。我不确定PCRE或PHP特别如何处理它。我会看看能否找到任何相关文档。 - Powerlord
我找到了这个:http://www.php.net/manual/zh/regexp.reference.php 向下滚动到\W。 - runfalk
这很完美 - 特别是对于 & 类型的字符 - 不确定换行等是否适用。 - Johnny Darvall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接