1

过滤非字母数字“重复”字符的最佳方法是什么

我宁愿不建立要检查的字符列表。有没有好的正则表达式可以在 PHP 中使用。

例子:

...........

*****************

!!!!!!!! 

########### 

------------------

~~~~~~~~~~~~~

特殊情况模式:

=*=*=*=*=*=

->->->->
4

7 回答 7

1

模式可能是这样的:s/([\W_]|=\*|->)\1+//g
或者,如果您只想用一个实例替换:s/([\W_]|=\*|->)\1+/$1/g

编辑...可能任何特殊序列都应该在交替中首先出现,以防您需要制作==特殊的东西,它不会被 [\W_] 抓住。

所以有点像s/(==>|=\*|->|[\W_])\1+/$1/g特殊情况首先出现的地方。

于 2011-03-11T00:30:29.713 回答
1

基于@sln 答案:

$str = preg_replace('~([^0-9a-zA-Z])\1+|(?:=[*])+|(?:->)+~', '', $str);
于 2011-03-11T00:45:33.080 回答
0
replace(/([^A-Za-z0-9\s]+)\1+/, "")

将删除非字母数字非空白字符串的重复模式。

但是,这是一种不好的做法,因为您还将删除 Unicode 基础中的所有非 ASCII 欧洲和其他国际语言字符。

您真正不会关心国际化的唯一地方是处理源代码,但是您不处理字符串中引用的文本,并且您还可能不小心取消注释块。

您可能希望通过提供要替换的字符列表而不是包罗万象来限制您尝试删除的内容。

编辑:在尝试处理早期版本的 ShoutCAST 无线电名称之前,我做过类似的事情。当时,电台试图通过使用令人讨厌的名称来引起人们的注意,例如:<<!!!!--- GREAT MUSIC STATION ---!!!!>>. 我使用类似的编码来消除重复的符号,但后来学会(艰难的方式)小心我最终删除的内容。

于 2011-03-11T03:59:58.770 回答
0

sin 的解决方案非常好,但\W“非单词”类的使用包括空格。我认为您不想删除制表符或空格序列!使用否定类(例如:' [^A-Za-z0-9\s]')会更好。

于 2011-03-11T02:29:04.640 回答
0

这将过滤掉所有符号

[代码] $q = ereg_replace("[^A-Za-z0-9 ]", "", $q); [/代码]

于 2011-03-11T02:36:53.853 回答
0

这对我有用: preg_replace('/(.)\1{3,}/i', '', $sourceStr); 它会删除所有连续重复 3 次以上的符号。

于 2011-03-20T10:03:55.103 回答
0
preg_replace('~\W+~', '', $str);
于 2011-03-10T23:54:47.567 回答