之前做了一个发射弹幕的功能,有一个需求,是要将用户发射的敏感弹幕给屏蔽掉。第一次做这种功能,于是在网上搜罗了一些例,看到PHP用Trie树实现敏感词过滤是比较通用的一种办法。在这里简单记录下实现的思路吧。
解决字符集的问题
|
|
用Trie树实现敏感词树
字符单位确认以后,然后实现Trie树了。
简单的算法,从根路径开始给每个字符建一个关联数组,当字符串结束的时候,用一个null表示结尾!将敏感词列表以这样的关系存入字典树中。匹配是否包含敏感词的话,一直根据字符在字典树中一直找到null为止就表明存在,任一字符不存在就表明串不存在~
因为PHP没有全局缓存的机制,每次都要从数据库或者redis中读取全部的敏感词,然后建立Trie树再去匹配串的话太麻烦了,采取的办法是将Trie内部的关联数组序列化后直接保存在数据库中,每次只要读取这条数据,然后反序列化,Trie树就回来了。当然进行串的插入和删除,将更新这个序列化数据。
|
|
简单的敏感词过滤的类就是实现啦,也不算是很难~