php实现敏感词过滤
敏感词过滤的实现方法
在PHP中实现敏感词过滤可以通过多种方式完成,以下是几种常见的方法:
使用数组和str_replace函数
将敏感词存储在一个数组中,然后使用str_replace函数进行替换:
$sensitiveWords = ['敏感词1', '敏感词2', '敏感词3'];
$content = "这是一段包含敏感词1的文本";
$filteredContent = str_replace($sensitiveWords, '*', $content);
使用正则表达式匹配
对于更复杂的匹配模式,可以使用preg_replace函数:
$pattern = '/敏感词1|敏感词2|敏感词3/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, 'UTF-8');
for ($i = 0; $i < $len; $i++) {
$char = mb_substr($word, $i, 1, 'UTF-8');
if (!isset($node->children[$char])) {
$node->children[$char] = new TrieNode();
}
$node = $node->children[$char];
}
$node->isEnd = true;
}
public function filter($text) {
// 实现过滤逻辑
}
}
使用第三方库
可以考虑使用现成的敏感词过滤库,如:
- lustre/php-sensitive:一个高效的敏感词过滤库
- fuzzdb-project:提供敏感词数据集
安装示例:

composer require lustre/php-sensitive
使用示例:
use Lustre\Sensitive\TrieTree;
$filter = new TrieTree();
$filter->addWords(['敏感词1', '敏感词2']);
$filteredText = $filter->replace($text, '*');
数据库存储敏感词
对于需要频繁更新的敏感词列表,可以存储在数据库中:
// 从数据库获取敏感词
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->query('SELECT word FROM sensitive_words');
$words = $stmt->fetchAll(PDO::FETCH_COLUMN);
// 过滤内容
$filteredContent = str_replace($words, '*', $content);
性能优化建议
对于大量文本处理,可以考虑以下优化:
- 将敏感词缓存到内存中,减少数据库查询
- 使用AC自动机算法提高匹配效率
- 对文本进行分段处理,降低内存占用
- 使用PCRE JIT编译正则表达式
实际应用中的注意事项
- 注意处理Unicode字符和多字节字符串
- 考虑添加白名单机制,避免误判
- 记录过滤日志,便于后续分析
- 定期更新敏感词库
以上方法可以根据实际需求选择或组合使用,对于中小型应用,数组替换或正则表达式通常足够;对于大型高并发应用,建议使用Trie树或AC自动机等高效算法。






