过滤非字母数字“重复”字符

时间:2011-03-10 23:49:37

标签: php regex character repeat non-alphanumeric

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

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

示例:

...........

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

!!!!!!!! 

########### 

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

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

特殊案例模式:

=*=*=*=*=*=

->->->->

7 个答案:

答案 0 :(得分:1)

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

编辑...可能任何特殊的序列应该在交替中首先出现,因为你需要制作像==这样的东西,它不会被[\ _ _ _]抓住。

类似于s/(==>|=\*|->|[\W_])\1+/$1/g,首先是特殊情况。

答案 1 :(得分:1)

基于@sln回答:

$str = preg_replace('~([^0-9a-zA-Z])\1+|(?:=[*])+|(?:->)+~', '', $str);

答案 2 :(得分:0)

preg_replace('~\W+~', '', $str);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这将过滤掉所有符号

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

答案 5 :(得分:0)

replace(/([^A-Za-z0-9\s]+)\1+/, "")

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

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

你真正不会关心国际化的唯一地方是处理源代码,但是你没有处理字符串中引用的文字,你也可能会意外地删除一个块。

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

编辑:我在尝试处理早期版本的ShoutCAST广播名称之前做过类似的事情。那个时候,电视台试图用令人讨厌的名字来引起人们的注意:<<!!!!--- GREAT MUSIC STATION ---!!!!>>。我使用类似的编码来摆脱重复的符号,但后来学会了(很难)在我最终删除的内容时要小心。

答案 6 :(得分:0)

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