內容安全是 UGC(用戶生成內容)系統的核心需求。PHP 提供了多種字符串替換與匹配手段,本文對比 陣列映射替換(strtr) 與 正則表達式(preg_match/preg_replace) 兩種主流方案,幫助你根據業務場景選型。
<?php
// 敏感詞庫
$badword = array('張三', '張三豐', '張三豐田');
// 構建「敏感詞 => 替換字符」映射表
$badword_map = array_combine($badword, array_fill(0, count($badword), '*'));
// 待檢測文本
$text = '我今天開著張三豐田上班';
// 執行替換(最長優先匹配)
$filtered = strtr($text, $badword_map);
echo $filtered; // 輸出:我今天開著***上班
?>
strtr 內部優化,對長字符串、大量關鍵詞性能優於 str_replace。<?php
$blacklist = array('中國', '日本');
// 構建正則:/中國|日本/i (i 忽略大小寫)
$pattern = '/' . implode('|', $blacklist) . '/i';
$str = '中國是一個很好的國家';
// 檢測是否包含敏感詞
if (preg_match($pattern, $str, $matches)) {
echo "發現敏感詞:" . $matches[0]; // 輸出:中國
} else {
echo "未發現";
}
// 替換為等長星號(進階)
$replaced = preg_replace_callback($pattern, function($m) {
return str_repeat('*', mb_strlen($m[0]));
}, $str);
echo $replaced; // ***是一個很好的國家
?>
preg_replace_callback 可實現動態替換邏輯(如等長遮罩、記錄日誌)。. * + ? | ( ) [ ] { })需 preg_quote 轉義。php-aho-corasick 擴展)。| 場景 | 推薦方案 |
|---|---|
| 幾百詞內、精確替換、追求簡單 | strtr + 映射表 |
| 需模糊匹配、變體識別、動態替換邏輯 | 正則 preg_replace_callback |
| 萬級詞庫、高併發、毫秒級響應 | AC 自動機(C 擴展或純 PHP 實現) |