php检测是否存在敏感词,用于检测敏感词的 PHP 扩展

敏感词过滤是我朝程序员必须具备的一种特殊技能,随着敏感词越来越多,是时候写个扩展来快速的进行敏感词检测了

使用说明

1. 安装 libdatrie

tar zxf libdatrie-0.2.4.tar.gz

cd libdatrie-0.2.4

./configure --prefix=/usr/local

make

make install

2. 安装 trie_filter 扩展

tar zxf trie_filter-1.0.0.tar.gz

cd trie_filter-1.0.0

/usr/local/php/bin/phpize

./configure  --with-php-config=/usr/local/php/bin/php-config

make

make install

记得修改你的 php.ini 文件,启用 trie_filter 扩展。extension=trie_filter.so

3. 生成词典预处理工具(dpp.c 在 trie_filter-1.0.0 里面)

gcc -o dpp dpp.c -ldatrie

4. 生成敏感词词典

首先你需要把需要检测的敏感词写入到一个文本文件中(如:minganci.txt),每行一个敏感词,然后使用上一步生成的 dpp 程序处理这个文本文件来生成词典

./dpp txt_file_path dict_file_path

(例:./dpp  /home/like/software/minganci.txt  minganci.dic

出现如下错误:

./dpp: error while loading shared libraries: libdatrie.so.1: cannot open shared object file: No such file or directory

解决方法:

#vi /etc/ld.so.conf  在里面加入:/usr/local/lib

然后运行:#/sbin/ldconfig,即解决

最后再:./dpp  /home/like/software/minganci.txt  minganci  )

5. 使用扩展

扩展接口很简单,只有两个函数:

1) trie_filter_load($path_to_dict)

用来载入词典,成功返回一个 Trie_Filter 资源句柄,失败返回 NULL

2) trie_filter_search($trie, $text)

用来检测一段文本中是否含有词典中定义的敏感词,$trie 是上一个函数返回的 Trie Filter 句柄,$text 是欲检测的文本

如果检测到敏感词则返回一个数组,数组第一个元素指出检测到的敏感词在 $text 中的偏移量,第二个元素指出该敏感词的长度(bytes)

如果没有检测到敏感词,则返回一个空数组

扩展的速度怎么样

一个字,很快!扩展的检测算法基于 Double Array Trie Tree,查找单一关键字的时间复杂度为 O(1),查找整段文本的时间复杂度为 O(n),n 为文本的长度,而且检测的速度不会因为敏感词的增加而降低。

注意事项

1. 扩展把词典和要检测的文本都当做平凡的字节流处理,因此可以无视字符集的问题。但需要注意的是词典的编码需要和检测文本的编码一致(我曾经犯过这样的错误:词典编码和文本编码不一样,生成的词典用不了),例如词典为 UTF-8 编码而你需要检测的文本为 GBK 编码,这就要求你在调用 trie_filter_search() 函数之前通过 iconv 或者 mb_xxx 函数转换一下编码

2. 目前只在 linux + php-5.2 环境下测试通过,不支持 windows,也没有支持的计划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值