1. 程式人生 > >PHP 擴充套件 trie-tree, swoole過濾敏感詞方案

PHP 擴充套件 trie-tree, swoole過濾敏感詞方案

在一些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();