关键词过滤扩展,用于检查一段文本中是否出现敏感词,基于
Double-Array Trie
树实现。
- PHP 7 +
- libdatrie (Version >= 0.2.4)
因为本项目依赖于 libdatrie
, 所以需要先安装 libdatrie, 再安装本扩展。
$ wget https://github.com/tlwg/libdatrie/releases/download/v0.2.11/libdatrie-0.2.11.tar.xz
$ tar zxvf libdatrie-0.2.11.tar.xz
$ cd libdatrie-0.2.11
$ ./configure && make && make install
PS: libdatrie
依赖于 libiconv
, 如果编译的时候报 undefined reference to libiconv
, 你需要先安装 libiconv
。如果安装完还有错误可以执行这个命令 ./configure LDFLAGS=-L/usr/local/lib LIBS=-liconv
。
$ git clone https://github.com/cdoco/xfilter.git && cd xfilter
$ phpize && ./configure && make && make install
你可以在 php.ini
中设置字典文件的路径, 如果你不想在 php.ini
中设置你也可以在 setFileName
方法中设置。
[xfilter]
extension=xfilter.so
// 你可以在这里设置加载的字典文件路径
xfilter.filename=/path/to/xfilter/blackword.dic
<?php
use Cdoco\Filter;
// 这个方法里可以传入词典的路径或者在 php.ini 中设置
Filter::setFileName(__DIR__ . '/blackword.dic');
// 保存敏感词到字典文件中
Filter::save(['敏感词', '高子航', 'xfilter']);
// 搜索字符串中的敏感词 会返回敏感词的起始位置和长度
$rs = Filter::search('这是一个敏感词测试语句, 由高子航创造, xfilter, By ZiHang Gao。');
// Array
// (
// [0] => Array
// (
// [0] => 12
// [1] => 9
// )
//
// [1] => Array
// (
// [0] => 38
// [1] => 9
// )
//
// [2] => Array
// (
// [0] => 55
// [1] => 7
// )
//
// )
print_r($rs);
该方法可以传入一个敏感词的字典文件路径。
Filter::setFileName(string $filename);
// 示例
Filter::setFileName(__DIR__ . '/blackword.dic');
保存一个敏感词数组到字典文件中, 如果在 setFileName
方法中设置了路径, 会优先使用 setFileName
方法中的路径, 如果没有会使用 php.ini
中设置的 xfilter.filename
。
boolean Filter::save(array $blackword [, boolean $append = false]);
// 示例
Filter::save(['敏感词', '高子航', 'xfilter'], true);
save
方法有两个参数, 第一个参数 $blackword
是一个敏感词的数组, 第二个参数 $append
用来表示是否是追加写入。
<?php
use Cdoco\Filter;
Filter::setFileName(__DIR__ . '/blackword.dic');
Filter::save(['xfilter']);
$rs = Filter::search('xfilter, By ZiHang Gao。');
// Array
// (
// [0] => Array
// (
// [0] => 0
// [1] => 7
// )
//
// )
print_r($rs);
// 不设置 $append 参数 save 方法会重新建立一个文件
Filter::save(['cdoco']);
$rs = Filter::search('xfilter, By ZiHang Gao。');
// Array
// (
// )
print_r($rs);
// 如果设置了 $append 为 true, save 方法会在之前字典的基础上追加敏感词
Filter::save(['xfilter'], true);
$rs = Filter::search('cdoco, By ZiHang Gao。');
// Array
// (
// [0] => Array
// (
// [0] => 0
// [1] => 5
// )
//
// )
print_r($rs);
搜索一个字符串中是否包含敏感词。
array Filter::search(string $text);
// 示例
Filter::search('这是一个敏感词测试语句, 由高子航创造, xfilter, By ZiHang Gao。');
search
方法会返回一个二维数组, 包含敏感词出现的位置和长度, 你可以用 substr
方法截取出敏感词。
Array
(
[0] => Array
(
[0] => 0 //敏感词出现的位置
[1] => 5 //敏感词的长度
)
)
<?php
use Cdoco\Filter;
// 截取字符串
$content = '这是一个敏感词测试语句, 由高子航创造, xfilter, By ZiHang Gao。';
$rs = Filter::search($content);
foreach ($rs as $v) {
echo substr($content, $v[0], $v[1]) . "\n";
}
// 敏感词
// 高子航
// xfilter
删除字典文件中的敏感词。
boolean Filter::delete(string $keyword);
// 示例
Filter::delete('高子航');
@wulijun 的 trie-filter
扩展已不维护更新, 目前使用起来有点繁琐。这个项目是根据自己的想法, 在 trie-filter 的基础上修改而来, 感谢 @wulijun。
PHP License. See the LICENSE file.