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

  

PHP 扩展 trie-tree, swoole过滤敏感词方案的更多相关文章

  1. 过滤敏感词工具类SensitiveFilter

    网上过滤敏感词工具类有的存在挺多bug,这是我自己改用的过滤敏感词工具类,目前来说没啥bug,如果有bug欢迎在评论指出 使用前缀树 Trie 实现的过滤敏感词,树节点用静态内部类表示了,都写在一个 ...

  2. [原创] Trie树 php 实现敏感词过滤

    目录 背景 简介 存储结构 PHP 其他语言 字符串分割 示例代码 php 优化 缓存字典树 常驻服务 参考文章 背景 项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_r ...

  3. 【SpringBoot】前缀树 Trie 过滤敏感词

    1.过滤敏感词 Spring Boot实践,开发社区核心功能 完成过滤敏感词 Trie 名称:Trie也叫做字典树.前缀树(Prefix Tree).单词查找树 特点:查找效率高,消耗内存大 应用:字 ...

  4. web前端js过滤敏感词

    web前端js过滤敏感词 这里是用文本输入框还有文本域绑定了失去焦点事件,然后再遍历敏感词数组进行匹配和替换. var keywords=["阿扁","呵呵", ...

  5. (转)两种高效过滤敏感词算法--DFA算法和AC自动机算法

    原文:https://blog.csdn.net/u013421629/article/details/83178970 一道bat面试题:快速替换10亿条标题中的5万个敏感词,有哪些解决思路? 有十 ...

  6. SpringBoot开发十四-过滤敏感词

    项目需求-过滤敏感词 利用 Tire 树实现过滤敏感词 定义前缀树,根据敏感词初始化前缀树,编写过滤敏感词的方法 代码实现 我们首先把敏感词存到一个文件 sensitive.txt: 赌博 嫖娼 吸毒 ...

  7. Trie性能分析之敏感词过滤golang

    package util import ( "strings" ) type Node struct { //rune表示一个utf8字符 char rune Data inter ...

  8. [转]Filter实现处理中文乱码,转义html标签,过滤敏感词

    原文地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可 ...

  9. js 过滤敏感词 ,可将带有标点符号的敏感词过滤掉

    function transSensitive(content) { // var Sensitive = H.getStorage("Sensitive");//敏感词数组 va ...

随机推荐

  1. Servlet映射规范和隐式映射

    问题描述: web.xml中配置了缺省路径"/"后,原先在webapp下的静态页面(html)无法通过URL访问了,为什么? 过程尝试: 1. 将html后缀改为.jsp后可以正常 ...

  2. C#实现字符串相似度算法

    字符串的相似性比较应用场合很多,像拼写纠错.文本去重.上下文相似性等. 评价字符串相似度最常见的办法就是: 把一个字符串通过插入.删除或替换这样的编辑操作,变成另外一个字符串,所需要的最少编辑次数,这 ...

  3. 自动化测试基础篇--Selenium unittest生成测试报告(HTMLTestRunner)

    如何生成HTMLTestRunner测试报告.接上篇文章,对于unittest框架,运行后,测试结果不便于查看,同时多个case存在的时候,可能会导致case result记录不正确的情况. 为此,引 ...

  4. SQL读取注册表值

    最近写一个自动检查SQL Serve安全配置的检查脚本,需要查询注册表,下面是使用SQL查询注册表值的方法. ) ) ) ) --For Named instance --SET @Instance ...

  5. golang 时间戳 时间格式化 获取当前时间 timestamp 计算时间差

    获取当前时间 func Now func Now() Time 1 Now returns the current local time. func (Time) UTC func (t Time) ...

  6. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  7. January 13 2017 Week 2 Friday

    Those who turn back never reach the summit. 回头的人永远也到不了顶峰. I always turned back on my life road, so i ...

  8. node升级 npm的升级

    安装方法: 1.产看node版本,没安装的请先安装: node -v 2.清楚node缓存: sudo npm cache clean -f 3.安装node版本管理工具'n'; sudo npm i ...

  9. JS数据模板分离(告别字符串拼接)-template

    刚开始在写第一个动态网页的demo时,由于html不多,便使用字符串拼接的方法添加到dom来渲染,可是在后来写某外卖app时也需要如此添加,打开代码一看几千行,突然感觉累觉不爱 一行行的拼接有这功夫别 ...

  10. H3C笔试题目

    最近这段时间正在找工作,去H3C做了下笔试题,题目出的还不错,比一般公司水平高上一点点,偷偷弄了点回来,分享一下,我把答案和解析全部整理了出来,有需要的可以看看. 1.以下描述正确的有(AD) A.1 ...