新手正则表达式问题 - 检测垃圾邮件

时间:2009-11-14 10:02:14

标签: regex detect spam

这是我的正则新手问题:

  • 如何检查字符串是否包含3个垃圾字? (例如:伟哥,药片和商店)
  • 如何检测“v-iagra”或“v.iagra”等垃圾词的变体? (另外一个角色)

2 个答案:

答案 0 :(得分:3)

正则表达式似乎不是这个特殊钉子的正确锤子。对于您的列表,您可以简单地将所有列入黑名单的单词放入某种排序列表中,并针对该列表扫描每个标记。直接字符串操作总是比调用正则表达式引擎更快。

对于你的变体(“v-iagra”,et.al),我会删除所有非字符(如@Kinopiko建议的那样),然后再次将它们移过你的黑名单。如果你对“viiagra”等事情保持警惕,我会查看Aspell。它是一个很棒的库,看起来像CPAN有一个Perl绑定。

答案 1 :(得分:2)

  

如何检查字符串是否包含3个垃圾字? (例如:伟哥,药片和商店)

发现这三个单词中的任何一个的正则表达式可能看起来像这样(Perl):

if ($string =~ /(viagra|pills|shop)/) {
    # spam
}

如果你想发现所有这三个,单凭正则表达式还不够:

my $bad_words = 0;
while ($string =~ /(viagra|pills|shop)/g) {
     $bad_words++;
}
if ($bad_words >= 3) {
     # spam
}
  

如何检测“v-iagra”或“v.iagra”等垃圾词的变体? (另外一个角色)

只用正则表达式来做这件事并不容易。你可以试试像

这样的东西
 $string =~ s/\W//g;

删除所有非字字符。和 - ,然后使用上面的测试检查字符串。这也会剥夺空间。