敏感詞資料表 `uc_badwords`:
| 欄位 | 說明 | 範例 |
|---|---|---|
| id | 自增 ID | 1 |
| admin | 建立管理員 | UCenterAdminist |
| find | 原始敏感詞 | 訪問 |
| replacement | 替換詞 | 大 |
| findpattern | PCRE 正則模式 | /訪問/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
);
}
?>
當 pattern 與 replacement 皆為陣列時,依據鍵名在陣列中出現的順序依序處理,而非數值索引順序。
若需按特定順序替換 (如長詞優先避免短詞誤殺),建議:
<?php // 1. 從資料庫查詢時已按長度 DESC 排序 // 2. 或建立快取前手動排序 ksort($cache['findpattern']); // 確保鍵名順序一致 ksort($cache['replace']); ?>
⚠️ 使用 `@` 抑制錯誤可能隱藏正則編譯失敗。建議移除 `@`,上線前完整測試所有 pattern 有效性,並記錄失敗日誌供排查。