正则表达式 - 匹配(仅)具有混合字符的单词

时间:2009-05-10 19:08:30

标签: php regex filter match profanity

我正在写我的反垃圾邮件/恶意过滤器,我需要,如果可能,

匹配(检测)仅由混合字符组成的单词,例如:fr1& nd $而不是朋友

这可能与正则表达式有关吗??

最好的问候!

4 个答案:

答案 0 :(得分:6)

当然可以使用正则表达式!你不是要求匹配嵌套的括号! :P

但是,是的,这是正则表达式的构建方式。一个例子:

/\S*[^\w\s]+\S*/

这将符合以下所有条件:

@ss
as$
a$s
@$s
a$$
@s$
@$$

匹配:

ass

我认为这就是你想要的。工作原理:

\S*匹配0个或更多非空格字符。 [^\w\s]+仅匹配符号(它将匹配任何不是单词或空格的内容),并匹配其中的一个或多个(因此需要符号字符。)然后\S*再次匹配0个或更多非空格字符(符号和字母)。

如果我可以被允许建议一个更好的策略,在Perl中你可以将一个正则表达式存储在一个变量中。我不知道你是否可以用PHP做到这一点,但如果可以,你可以构建一个变量列表,如:

$a = /[aA@]/ # regex that matches all a-like symbols
$b = /[bB]/
$c = /[cC(]/
# etc...

或者:

$regex = array( 'a' => /[aA@]/, 'b' => /[bB]/, 'c' => /[cC(]/, ... );

这样,您可以将“朋友”的所有排列与:

匹配
/$f$r$i$e$n$d/

或者:

/$regex['f']$regex['r']$regex['i']$regex['e']$regex['n']$regex['d']/

当然,第二个看起来不必要的冗长,但那是你的PHP。我认为第二个可能是最好的解决方案,因为它将它们全部存储在哈希中,而不是全部存储为单独的变量,但我承认它产生的正则表达式有点难看。

答案 1 :(得分:0)

您可以构建一些正则表达式,如下所示:

\p{L}+[\d\p{S}]+\S*

这将匹配一个或多个字母的任何序列(\p{L}+,请参阅Unicode character preferences),一个或多个数字或符号([\d\p{S}]+)以及任何后续的非空格字符{{ 1}}。

\S*

答案 2 :(得分:0)

有可能,你不会有非常漂亮的正则表达式规则,但你可以匹配任何你可以使用正则表达式描述的模式。棘手的部分是描述它。

我猜你会有一堆正则表达式规则来检测这样的坏词:

要检测fr1& nd $,朋友,fr * nd *你可以使用正则表达式:

/fr[1iI*][&eE]nd[s$Sz]/

对每个规则执行类似的操作会在括号中找到可能字符的所有变体。选择正则表达式指南以获取更多信息。

(我假设你需要friend以及frie**的坏词过滤器,你可能想要掩盖坏词以及所有可能的排列)

答案 3 :(得分:0)

没有彻底测试,但应该这样做:

(\w+)*(?<=[^A-Za-z ])