欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP 扩展 trie-tree, swoole过滤敏感词方案

程序员文章站 2022-07-02 18:07:14
在一些app,web中评论以及一些文章会看到一些*等,除了特定的不显示外,我们会把用户输入的一些敏感字符做处理,具体显示为*还是其他字符按照业务区实现。 下面简单介绍下业务处理。 ......

在一些app,web中评论以及一些文章会看到一些*等,除了特定的不显示外,我们会把用户输入的一些敏感字符做处理,具体显示为*还是其他字符按照业务区实现。

下面简单介绍下业务处理。

原文地址:小时刻个人博客 >

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();