php 检测敏感字的实现

背景:项目中,有用到短信批量发送,三大运营商关于内容都有自己的过滤。所以,在写好内容发送前需要检测下是不是有敏感字在里面。查找资料后,有两种实现方式,先记录如下,回去再用自己的ubuntu虚拟机试试两种方法的效率怎么样。

一、通过安装扩展(以下内容来自 http://alex.jiluri.com/article/5a7d5370b982e.html)

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
phpize
./configure –with-php-config=/path/to/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. 生成敏感词词典


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

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,也没有支持的计划欢迎大家测试使用,提出建议


二、通过自己将敏感词拼接成一个长正则表达式或循环敏感词文件通过preg_match("/".trim($content[$i])."/i",$str)函数来手动查找$str内容是否包含敏感词。 "/i"在正则中表示不区分大小写 


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值