首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 敏感詞過濾:strtr 與正則兩種實現方案對比

     編輯:PHP 綜合知識

前言

內容安全是 UGC(用戶生成內容)系統的核心需求。PHP 提供了多種字符串替換與匹配手段,本文對比 陣列映射替換(strtr) 與 正則表達式(preg_match/preg_replace) 兩種主流方案,幫助你根據業務場景選型。

方案一:strtr + 陣列映射(適合精確詞替換)

<?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 轉義。
  • 超大詞庫(萬級以上)編譯正則耗時,建議改用 AC 自動機(如 php-aho-corasick 擴展)。

選型建議

場景推薦方案
幾百詞內、精確替換、追求簡單strtr + 映射表
需模糊匹配、變體識別、動態替換邏輯正則 preg_replace_callback
萬級詞庫、高併發、毫秒級響應AC 自動機(C 擴展或純 PHP 實現)

最佳實踐提示

  1. 敏感詞庫建議存放於 Redis/資料庫,定期熱更新,避免代碼硬編碼。
  2. 前端攔截 + 後端二次過濾,雙重保障。
  3. 記錄命中日誌(用戶、IP、原文、命中詞),便於審計與模型優化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved