php实现敏感词过滤
PHP实现敏感词过滤的方法
敏感词过滤是网站开发中常见的需求,以下介绍几种PHP实现敏感词过滤的方法:
使用字符串替换函数
$content = "这是一段包含敏感词的文本";
$sensitiveWords = ["敏感词", "不良词"];
$replacement = "*";
$filteredContent = str_replace($sensitiveWords, $replacement, $content);
这种方法简单直接,适合少量敏感词的情况。
使用正则表达式匹配
$content = "这是一段包含敏感词的文本";
$pattern = '/敏感词|不良词|违禁词/i';
$replacement = "*";
$filteredContent = preg_replace($pattern, $replacement, $content);
正则表达式方法效率更高,适合大量敏感词的情况。
使用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;
$len = mb_strlen($word);
for ($i = 0; $i < $len; $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, $replaceChar = '*') {
$result = [];
$len = mb_strlen($text);
for ($i = 0; $i < $len; $i++) {
$node = $this->root;
$j = $i;
while ($j < $len) {
$char = mb_substr($text, $j, 1);
if (!isset($node->children[$char])) break;
$node = $node->children[$char];
if ($node->isEnd) {
$result[] = mb_substr($text, $i, $j - $i + 1);
$i = $j;
break;
}
$j++;
}
}
return str_replace($result, $replaceChar, $text);
}
}
// 使用示例
$filter = new SensitiveWordFilter();
$filter->addWord("敏感词");
$filter->addWord("不良词");
$text = "这是一段包含敏感词和不良词的文本";
echo $filter->filter($text);
使用第三方库
可以考虑使用现成的敏感词过滤库,如:

- lustre/php-sensitive:一个高性能的敏感词过滤库
- fuzzdb:提供大量敏感词数据集
安装示例:
composer require lustre/php-sensitive
使用示例:
use Lustre\Sensitive\SensitiveWordFilter;
$filter = new SensitiveWordFilter();
$filter->addWords(['敏感词', '不良词']);
$text = "这是一段包含敏感词的文本";
echo $filter->filter($text, '*');
性能优化建议
- 将敏感词库缓存到内存中,避免每次请求都重新加载
- 对长文本采用分段处理
- 考虑使用AC自动机算法处理更复杂的匹配需求
- 定期更新敏感词库
注意事项
- 处理中文时确保使用mb_系列函数
- 考虑大小写敏感问题
- 注意处理特殊字符和空格
- 对用户输入进行必要的转义
以上方法可以根据实际项目需求选择或组合使用,对于高并发场景建议使用专门的服务或扩展来实现敏感词过滤功能。






