敏感词过滤主要包括以下部分:
(1)词库的维护
(2)实时生成的词库词典文件
(3)根据词典文件对比要校验的文字
其中第一步,词库的维护,就是简单的CRUD操作,不再赘述。而后两步比较关键,而且处理不好也可能是一个性能门槛。
这里推荐使用 php-ext-trie-filter 这个第三方扩展来实现,用于检查一段文本中是否出现敏感词,基于 Double-Array Trie
树实现。
一、安装依赖库
依赖库:libdatrie
1 2 3 4 5 6
| $ tar zxvf libdatrie-0.2.4.tar.gz $ cd libdatrie-0.2.4 $ make clean $ ./configure --prefix=$LIB_PATH $ make $ make install
|
二、安装 php-ext-trie-filter
1 2 3 4 5 6
| $ git clone https://github.com/zzjin/php-ext-trie-filter $ cd php-ext-trie-filter $ $INSTALL_PHP_PATH/bin/phpize $ ./configure --with-php-config=$INSTALL_PHP_PATH/bin/php-config --with-trie_filter=$LIB_PATH $ make $ make install
|
然后修改 php.ini ,增加一行:extension=trie_filter.so
,然后重启PHP。
主要方法:
1 2 3 4 5 6 7 8 9 10 11
| $trie = trie_filter_new(); trie_filter_store($trie, $word); trie_filter_save($trie, __PATH__);
$trie = trie_filter_load(__PATH__); $string = "..."; $result = trie_filter_search($trie, $string); $resAll = trie_filter_search_all($trie, $string); trie_filter_free($trie);
|
这里 $result
和 $resAll
的格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $result = [ 0 => 5, 1 => 3 ];
$resAll = [ 0 => [ 0 => 5, 1 => 3 ], 1 => [ 0 => 15, 1 => 8 ] ];
|