php实现敏感词过滤
PHP实现敏感词过滤的方法
敏感词过滤是Web开发中常见的需求,PHP可以通过多种方式实现。以下是几种常用方法:
使用str_replace函数进行简单替换
$sensitiveWords = ['敏感词1', '敏感词2', '敏感词3'];
$replacement = '*';
$content = "这是一段包含敏感词1和敏感词2的文本";
$filteredContent = str_replace($sensitiveWords, $replacement, $content);
这种方法简单直接,适合小规模敏感词库,但性能随敏感词数量增加而下降。
使用正则表达式匹配
$pattern = '/敏感词1|敏感词2|敏感词3/i';
$content = "这是一段包含敏感词1和敏感词2的文本";
$filteredContent = preg_replace($pattern, '*', $content);
正则表达式方法效率更高,适合中等规模的敏感词库,模式中的i修饰符使匹配不区分大小写。
使用Trie树数据结构
对于大规模敏感词库,Trie树是更高效的解决方案:
class TrieNode {
public $children = [];
public $isEnd = false;
}
class SensitiveWordFilter {
private $root;
public function __construct() {
$this->root = new TrieNode();
}
public function addWord($word) {
$node = $this->root;
for ($i = 0; $i < mb_strlen($word); $i++) {
$char = mb_substr($word, $i, 1);
if (!isset($node->children[$char])) {
$node->children[$char] = new TrieNode();
}
$node = $node->children[$char];
}
$node->isEnd = true;
}
public function filter($text) {
$result = '';
$length = mb_strlen($text);
for ($i = 0; $i < $length; $i++) {
$node = $this->root;
$j = $i;
while ($j < $length) {
$char = mb_substr($text, $j, 1);
if (!isset($node->children[$char])) break;
$node = $node->children[$char];
$j++;
if ($node->isEnd) {
$result .= str_repeat('*', $j - $i);
$i = $j - 1;
break;
}
}
if ($j == $i) {
$result .= mb_substr($text, $i, 1);
}
}
return $result;
}
}
// 使用示例
$filter = new SensitiveWordFilter();
$filter->addWord('敏感词1');
$filter->addWord('敏感词2');
$text = "这是一段包含敏感词1和敏感词2的文本";
echo $filter->filter($text);
Trie树方法适合大规模敏感词库,具有较高的匹配效率。
使用第三方库
可以考虑使用成熟的第三方库如:
lustre/php-sensitive-wordsyankewei/php-sensitive
安装示例:
composer require lustre/php-sensitive-words
使用示例:
require 'vendor/autoload.php';
$filter = new \Lustre\SensitiveWords\SensitiveWords();
$filter->addWords(['敏感词1', '敏感词2']);
$text = "这是一段包含敏感词1和敏感词2的文本";
echo $filter->filter($text, '*');
性能优化建议
对于高频访问场景,建议:
- 将敏感词库缓存到Redis等内存数据库中
- 使用AC自动机算法替代简单Trie树
- 对长文本采用分块处理策略
多字节字符处理
处理中文等多字节字符时,务必使用mb_系列函数:
mb_internal_encoding('UTF-8');
$length = mb_strlen($text);
$char = mb_substr($text, $i, 1);
以上方法可根据实际需求选择或组合使用,大规模应用建议采用Trie树或第三方库方案。







