php 敏感词过滤最简单实现

最近一个项目里面做到后面客户需要加入敏感词过滤,先摆个词库出来:全部词库

然后上网找了很多办法,主要会围绕这几个问题:

1. 效率问题

假设:

字典长度为 N (N = sum([len(word) for word in words])) 文章长度为 M

那么整个匹配的效率为 O(N*M),这个如果字库比较大或者文章比较长的时候就捉襟见肘了

解决这个问题的办法会比较高大上(意思是用比较复杂的算法和数据结构),最牛 X 的当然是后缀树,Trie 之类,但是没找到什么可用的现成代码,放弃这项优化;

2. 效果问题

实际上如果直接用 str_replace 来替换,那么每个关键词中间加入一些字符就可以绕过这个过滤了,这样明显会影响到过滤的效果。

因此,如果要保证效果,好的办法是,从原文章中删掉所有非中文字(包括标点符号等),再来进行过滤,完了再把分割的字符加回去。

太麻烦,我也不实现了,以后再想办法;

3. 钩子放在哪

这个我处理得超级懒人,直接在一个公有头里面对 $_POST 的所有字段进行了过滤

然后一切都那么完美,可以向客户交差了!

另外批量替换 php 是有一个内置函数 strtr($article, $from, $to) 的,下面看一下代码就知道了。


代码:

$words = array('敏感词一'=>'****','敏感词二'=>'****');
foreach($_POST as $key=>$val) {
    $_POST[$key] = strtr($val, $words);
}

把这段放在表单处理的程序段之前(譬如公共的 header 里面,或者 models 层构造函数之前),就这么简单!


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2014/09/php-sense-filter.html【php 敏感词过滤最简单实现】

发表评论

电子邮件地址不会被公开。 必填项已用*标注