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

UCenter 敏感詞過濾機制深度解析:preg_replace 陣列模式與快取策略

     編輯:PHP 綜合知識

資料結構設計

敏感詞資料表 `uc_badwords`:

欄位說明範例
id自增 ID1
admin建立管理員UCenterAdminist
find原始敏感詞訪問
replacement替換詞大
findpatternPCRE 正則模式/訪問/is

快取建立流程

<?php
// 私有方法:建立敏感詞快取
private function _get_badwords() {
    $data = $this->db->fetch_all("SELECT * FROM " . UC_DBTABLEPRE . "badwords");
    $return = array();
    
    if (is_array($data)) {
        foreach ($data as $k => $v) {
            // 關鍵:以索引對應 pattern 與 replacement
            $return['findpattern'][$k] = $v['findpattern'];
            $return['replace'][$k] = $v['replacement'];
        }
    }
    return $return;
}

// 初始化快取 (通常在應用啟動時)
$_CACHE['badwords'] = $this->base->cache('badwords');
?>

過濾執行邏輯

<?php
// 實際過濾呼叫
if ($_CACHE['badwords']['findpattern']) {
    // 關鍵:preg_replace 支援陣列模式,按鍵名順序配對替換
    $subject = @preg_replace(
        $_CACHE['badwords']['findpattern'], 
        $_CACHE['badwords']['replace'], 
        $subject
    );
    $message = @preg_replace(
        $_CACHE['badwords']['findpattern'], 
        $_CACHE['badwords']['replace'], 
        $message
    );
}
?>

preg_replace 陣列模式關鍵行為

當 pattern 與 replacement 皆為陣列時,依據鍵名在陣列中出現的順序依序處理,而非數值索引順序。

若需按特定順序替換 (如長詞優先避免短詞誤殺),建議:

<?php
// 1. 從資料庫查詢時已按長度 DESC 排序
// 2. 或建立快取前手動排序
ksort($cache['findpattern']); // 確保鍵名順序一致
ksort($cache['replace']);
?>

效能優化建議

  • 編譯快取:`preg_replace` 每次呼叫會重新編譯正則,大量敏感詞建議預編譯或使用 Trie 樹/AC 自動機演算法
  • 分級過濾:嚴重詞 (政治、色情) 即時攔截,一般詞異步處理
  • 快取更新策略:後台修改敏感詞後,主動清除/重建快取,避免舊版本殘留
  • 白名單機制:合法詞彙 (如「幹部」、「幹勁」) 加入白名單排除

安全性考量

⚠️ 使用 `@` 抑制錯誤可能隱藏正則編譯失敗。建議移除 `@`,上線前完整測試所有 pattern 有效性,並記錄失敗日誌供排查。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved