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

PHP 敏感詞過濾:黑名單關鍵字檢測與替換實戰

     編輯:PHP 綜合知識

核心思路

將違禁詞彙存於陣列或文字檔,用戶提交內容時,以正則或字串搜尋進行攔截或替換。

方案一:簡易陣列匹配(適合少量關鍵字)

function check_content($data) {
    $keywords = '你是大神嗎|你好|去死';  // 以 | 分隔
    if (preg_match("/$keywords/i", $data)) {
        return false;  // 含敏感詞,拒絕
    }
    return $data;      // 通過
}

方案二:外部詞庫檔案 + 替換模式(適合大量詞彙)

words.txt 格式:

|賭博機|賣血|出售腎|出售器官|眼角膜

過濾類別:

class WordFilter {
    private $wordFile;
    private $pattern;

    public function __construct($file) {
        $this->wordFile = $file;
        $this->buildPattern();
    }

    private function buildPattern() {
        $content = file_get_contents($this->wordFile);
        if ($content === false) {
            throw new Exception('敏感詞檔案讀取失敗');
        }
        // 清理格式:移除數字編號、多餘分隔符
        $content = preg_replace("/[\d,\s\|]+/", '|', trim($content, '|'));
        $this->pattern = '/(' . $content . ')/i';
    }

    public function filter($str, $replacement = '***') {
        return preg_replace($this->pattern, $replacement, $str);
    }
}

// 使用範例
$filter = new WordFilter('./words.txt');
$content = "<a href='#'>我要賭博機買血</a>";
echo $filter->filter($content);  // 輸出:我要***買***

進階優化建議

  • Trie 樹 / DFA 算法:百萬級詞庫、高併發場景下效能遠優於正則
  • 分詞預處理:中文分詞後再匹配,減少誤殺(如「中國」含「國」字)
  • 分級處理:一級詞彙直接攔截,二級詞彙替換,三級詞彙記錄審核
  • 快取機制:編譯後的正則模式快取至 Redis/APCu,避免重複建構

效能對比參考

方案適用規模優點缺點
preg_match 陣列< 100 詞簡單直觀詞多時極慢
preg_replace 詞庫< 5,000 詞支援替換、檔案管理正則回溯風險
DFA/Trie 樹> 10,000 詞O(n) 掃描、記憶體友善實作複雜
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved