我正在写我的反垃圾邮件/恶意过滤器,我需要,如果可能,
匹配(检测)仅由混合字符组成的单词,例如:fr1& nd $而不是朋友
这可能与正则表达式有关吗??
最好的问候!答案 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 ])