具有大型列表的高性能badwords过滤器(PHP / MySQL / JS)

时间:2015-06-23 08:48:35

标签: php forms performance validation filter

我目前正在开发一个网络表单,允许用户发布要在某种媒体上处理的邮件。由于我们必须验证输入并将其与给定的坏词列表进行解析,因此我开始选择许多选项。但是当列表到达并且持有大约15,000个单词来匹配时,我想知道如何处理这些最有效的方法。也许你可以帮助我!

基本上这可以是一个后端过滤器,但javascript中的额外前端批准将被赞赏(万一,可能是对后端的异步ajax请求?)。该表单将在高流量环境中使用,提交后的任何异步检查都可以省略,因为我们需要即时反馈给用户,并且不想只审查他们的输入。

我们使用PHP 5.4.0,附加了MySQL 5.5 InnoDB,并且不想使用任何第三方项目,因为它们主要带有某种超载IMHO。

2 个答案:

答案 0 :(得分:1)

正如我的评论中所提到的,这个question对使用什么软件有一些建议。

但实际上15000并不是那么多 - 每个单词5个字符的平均值低于100 kB的数据。如果要求不使用任何其他软件,那么您可以使用一些简单的方法进行较少的比较。

首先将您的badwords字典划分为相同字长的列表(因此,不是将每个字与所有可能的坏字进行比较,而是将它与具有相同长度的字进行比较)。

然后你有两种可能性,你必须对哪一种更快进行基准测试:

  • 对于用户帖子中的每个单词,计算其长度并与相同长度的所有坏词进行比较。
  • 或者尝试将所有单词放入数组中并删除重复项 - 并且只有在检查完badwords之后

使用此功能,您可以将比较次数减少到最少,但您仍需要执行大量的比较。

注意:这种方法适用于简单的单词。如果您的badwords字典也包含短语(更多单词之间有空格),您可以使用专门的软件或以相反的方式进行比较(对于每个badword短语,尝试在整个提交的帖子中找到它)。

另一个问题是,如果你真的需要检查所有15000个坏词,以及你的帖子中的潜在频率是否值得计算。此外,我想对于这样的高流量网站,你已经有了某种节制,可以捕获所有未被系统捕获的帖子(并且垃圾邮件可能比那些带有坏词的帖子更常见)。

答案 1 :(得分:0)

对PHP脚本的异步HTTP请求对我来说最有意义,实际上唯一有意义的事情。无需提交或刷新。