在一些app,web中評論以及一些文章會看到一些*等,除了特定的不顯示外,咱們會把用戶輸入的一些敏感字符作處理,具體顯示爲*仍是其餘字符按照業務區實現。php
下面簡單介紹下業務處理。html
原文地址:小時刻我的博客 > http://small.aiweimeng.top/index.php/archives/18.htmlweb
php擴展安裝說明:json
1.安裝php擴展trie-tree,安裝教程 http://blog.41ms.com/post/39.html 2.安裝swoole擴展,安裝教程 http://www.swoole.com/
**代碼說明:**緩存
1.reload_dict.php,提供自動更新字典庫到trie-tree文件的過程swoole
/** * 詞庫維護更新. * 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);
二、trie樹對象獲取工具類cookie
FilterHelper.php,提供獲取trie-tree對象,避免重複生成trie-tree對象和保證tree文件與敏感詞庫的同步更新app
/** * 過濾器助手. * 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; } } ``` 三、對外提供過濾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();