PHP 敏感词过滤

敏感词过滤主要包括以下部分:
(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-tree
trie_filter_store($trie, $word); // 向 trie-tree $trie 中,添加新词汇 $word
trie_filter_save($trie, __PATH__); // 将 $trie 保存为词典文件 __PATH__

# 敏感词校验过程
$trie = trie_filter_load(__PATH__); // 加载词典文件
$string = "..."; // 要判断的目标字符串
$result = trie_filter_search($trie, $string); // 取出第一个敏感词,并存入 $result
$resAll = trie_filter_search_all($trie, $string); // 取出所有敏感词,并存入 $resAll
trie_filter_free($trie); // 释放 $trie

这里 $result$resAll 的格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$result = [
0 => 5, // 表示敏感词的开头位置为第五个字符,从0开始计算。
1 => 3 // 表示敏感词的长度为3个字符。
];

$resAll = [
0 => [
0 => 5, // 表示第一个敏感词的开头位置为第5个字符,从0开始计算。
1 => 3 // 表示第一个敏感词的长度为3个字符。
],
1 => [
0 => 15, // 表示第二个敏感词的开头位置为第15个字符,从0开始计算。
1 => 8 // 表示第二个敏感词的长度为8个字符。
]
];