zoukankan      html  css  js  c++  java
  • 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') . "	dictionary reload success!
    ";
    }
    
    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();
    

      

  • 相关阅读:
    [codeforces] 97B Superset || 平面分治
    [hdu] 5696 区间的价值 || 序列分治
    [zoj] 1937 [poj] 2248 Addition Chains || ID-DFS
    [poj] 2286 The Rotation Game || ID-DFS
    [codeforces] 25E Test || hash
    luogu P1196 银河英雄传说
    luogu P1357 花园
    luogu P1156 垃圾陷阱
    luogu P1127 词链
    luogu P1131 时态同步
  • 原文地址:https://www.cnblogs.com/smallKilts/p/10217993.html
Copyright © 2011-2022 走看看