PHP 擴充套件 trie-tree, swoole過濾敏感詞方案
阿新 • • 發佈:2019-01-04
在一些app,web中評論以及一些文章會看到一些*等,除了特定的不顯示外,我們會把使用者輸入的一些敏感字元做處理,具體顯示為*還是其他字元按照業務區實現。
下面簡單介紹下業務處理。
原文地址:小時刻個人部落格 > http://small.aiweimeng.top/index.php/archives/18.html
php擴充套件安裝說明:
1.安裝php擴充套件trie-tree,安裝教程 http://blog.41ms.com/post/39.html 2.安裝swoole擴充套件,安裝教程 http://www.swoole.com/
**程式碼說明:**
1.reload_dict.php,提供自動更新字典庫到trie-tree檔案的過程
/** * 詞庫維護更新. * Date: 2018/11/7 * Time: 9:42 */ // 設定記憶體 ini_set('memory_limit','128M'); // 讀取敏感詞字典庫 $handle = fopen('dict.txt','r'); // 生成空的trie-tree-filter $resTrie = trie_filter_new(); while (! feof($handle)) { $item = trim(fgets($handle)); if(empty($item)) { continue; } // 把敏感詞逐個加入trie-tree trie_filter_store($resTrie, $item); } // 生成trie-tree檔案 $blackword_tree = 'blackword.tree'; trie_filter_save($resTrie, $blackword_tree);
2、trie樹物件獲取工具類
FilterHelper.php,提供獲取trie-tree物件,避免重複生成trie-tree物件和保證tree檔案與敏感詞庫的同步更新
/** * 過濾器助手. * getResTrie 提供trie-tree物件 * getFilterWords 提取過濾出的字串 * Date: 2018/11/7 * Time: 9:49 */ class FilterHelper { // trie-tree物件 private static $_resTrie = null; // 字典樹的更新時間 private static $_mtime = null; /** * 方式初始化 */ public function __construct(){} /** * 防止克隆物件 */ public function __clone(){} /** * 提供trie-tree物件 * * @param string $tree_file 字典檔案樹路徑 * @param string $new_time 當前呼叫時字典樹的更新時間 * @return null */ static public function getRecTrie($tree_file, $new_time) { if(is_null(self::$_mtime)) { self::$_mtime = $new_time; } if(($new_time != self::$_mtime) || is_null(self::$_resTrie)) { self::$_resTrie = trie_filter_load($tree_file); self::$_mtime = $new_time; // 輸出字典檔案過載時間 echo date('Y-m-d H:i:s') . "\tdictionary reload success!\n"; } return self::$_resTrie; } /** * 在源字串中提取過濾出的敏感詞 * * @param string $str 源字串 * @param array $res 1-3 表示 從位置1開始,3個字元長度 * @return array */ static public function getFilterWords($str, $res) { $result = array(); foreach ($res as $k => $v) { $word = substr($str, $v[0], $v[1]); if (!in_array($word, $result)) { $result[] = $word; } } return $result; } } ``` 3、對外提供過濾HTTP訪問介面 filter.php,使用swool,對外提交過濾介面訪問 ```php /** * 對外提供過濾HTTP訪問介面. * Date: 2018/11/7 * Time: 9:59 */ // 設定指令碼最大執行記憶體,根據字典大小調整 ini_set('memory_limit', '512M'); // 設定時區 date_default_timezone_set('PRC'); // 載入助手檔案 require_once('FilterHelper.php'); // http服務繫結的ip及埠 $serv = new \swoole_http_server("127.0.0.1", 9502); /** * 處理請求 */ $serv->on('Request', function($request, $response) { // 接收get請求引數 $content = isset($request->get['content']) ? $request->get['content']: ''; $result = ''; if (!empty($content)) { // 字典樹檔案路徑,預設當時目錄下 $tree_file = 'blackword.tree'; // 清除檔案狀態快取 clearstatcache(); // 獲取請求時,字典樹檔案的修改時間 $new_mtime = filemtime($tree_file); // 獲取最新trie-tree物件 $resTrie = FilterHelper::getResTrie($tree_file, $new_mtime); // 執行過濾 $arrRet = trie_filter_search_all($resTrie, $content); // 提取過濾出的敏感詞 $a_data = FilterHelper::getFilterWords($content, $arrRet); $result = json_encode($a_data); } // 定義http服務資訊及響應處理結果 $response->cookie("User", "W.Y.P"); $response->header("X-Server", "W.Y.P WebServer(Unix) (Red-Hat/Linux)"); $response->header('Content-Type', 'Content-Type: text/html; charset=utf-8'); $response->end($result); }); $serv->start();