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

Luc*_*ofi 2 php regex filter match profanity

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

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

这是可能的正则表达式!?

最好的祝福!

Chr*_*utz 6

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

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

/\S*[^\w\s]+\S*/
Run Code Online (Sandbox Code Playgroud)

这将匹配以下所有内容:

@ss
as$
a$s
@$s
a$$
@s$
@$$
Run Code Online (Sandbox Code Playgroud)

符合这个:

ass
Run Code Online (Sandbox Code Playgroud)

我认为这就是你想要的.这个怎么运作:

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

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

$a = /[aA@]/ # regex that matches all a-like symbols
$b = /[bB]/
$c = /[cC(]/
# etc...
Run Code Online (Sandbox Code Playgroud)

要么:

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

这样,你可以将"朋友"的所有排列与:

/$f$r$i$e$n$d/
Run Code Online (Sandbox Code Playgroud)

要么:

/$regex['f']$regex['r']$regex['i']$regex['e']$regex['n']$regex['d']/
Run Code Online (Sandbox Code Playgroud)

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