- A+
所属分类:PHP
最近需要做一个留言过滤敏感词的需求,由于词库有10万个词典,在尝试了各种算法以后,过滤速度均不是特别理想, 于是决定采用php的trie_filter 来进行过滤。
由于原作者的不支持php7,不过在github上找到了支持7.0以后的版本。
一、安装依赖库libdatrie
$ cd /usr/local/src/ $ curl -O ftp://linux.thai.net/pub/ThaiLinux/software/libthai/libdatrie-0.2.4.tar.gz $ tar zxvf libdatrie-0.2.4.tar.gz $ cd libdatrie-0.2.4 $ make clean $ ./configure --prefix=/usr/local/libdatrie $ make $ make install
二、安装 trie_filter $ cd /usr/local/src/
$ wget https://github.com/jiopuud/trie_filter/archive/master.zip $ unzip master.zip $ cd php-ext-trie-filter-master/ $ phpize $ ./configure --with-php-config=/usr/bin/php-config --with-trie_filter=/usr/local/libdatrie $ make $ make install
php5的版本地址:
https://github.com/wulijun/php-ext-trie-filter/archive/master.zip
在进行 下面这一步的时候 可能会提醒你 需要加上--with-php-config =
如果你不知道php-config的路径 可以用 find / -name php-config 来搜索
三、修改php.ini
修改php.ini,然后增加一行:extension=trie_filter.so,保存配置并重启php
四、检测词语是否有敏感字
参考代码:
<?php /** * Created by PhpStorm. * User: xjw * Date: 2019/5/9 * Time: 15:49 */ class SensitiveWord { public function load_sensitive_word_dict() { $dict_path = './admin/source/invalid.txt'; // 判断路径是否存在 if (!is_file ($dict_path)){ return false; } $arrWord = file( $dict_path ); // 创建一个空的trie tree $resTrie = trie_filter_new(); //向trie tree中添加敏感词 foreach ($arrWord as $k => $v) { trie_filter_store($resTrie, $v); } //生成敏感词文件 trie_filter_save($resTrie, './admin/source/invalid.tree'); if (!is_file ('./admin/source/invalid.tree')){ return false; } return true; } public function filter_sensitive_word($str){ if(!file_exists('./admin/source/invalid.tree')) { $this->load_sensitive_word_dict(); } // 加载敏感词 $resTrie = trie_filter_load('./admin/source/invalid.tree'); //在文本中查找所有的脏字 $arrRet = trie_filter_search($resTrie, $str); return $arrRet; } }