【问题标题】:Newbie regex question - detect spam新手正则表达式问题 - 检测垃圾邮件
【发布时间】:2009-11-14 10:02:14
【问题描述】:

这是我的正则表达式新手问题:

  • 如何检查一个字符串是否包含 3 个垃圾词? (例如:伟哥、药丸和商店)
  • 如何同时检测“v-iagra”或“v.iagra”等垃圾邮件词的变体? (增加一个字符)

【问题讨论】:

标签: regex detect spam


【解决方案1】:

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

对于您的变体(“v-iagra”等),我会删除所有非字符(如@Kinopiko 建议的那样),然后再次将它们从您的黑名单中运行。如果您对“viiagra”等内容持谨慎态度,我会查看Aspell。这是一个很棒的库,看起来 CPAN 有一个 Perl 绑定。

【讨论】:

  • \/iagra这样的替换呢
  • 锁只让诚实的人保持诚实。如果有人真的很投入,他们就会想办法写出他们想写的东西。也就是说,对于\/ 之类的V,似乎最简单(阅读:最直接)的方法需要手动编译这些类型的转换列表,将它们存储在映射中(像@ 这样的条目987654325@,然后在每个传入的令牌上对该映射的每个元素运行一个死记硬背的字符串替换。
【解决方案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;

删除所有非单词字符,如 .和 -,然后使用上面的测试检查字符串。不过,这也会去掉空格。

【讨论】:

  • 不要忘记 \W 包含下划线。 Vi_agra 仍然可以通过。
猜你喜欢
  • 1970-01-01
  • 2021-07-31
  • 2019-05-19
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2016-02-26
相关资源
最近更新 更多