PHP实现敏感词过滤系统「建议收藏」

PHP实现敏感词过滤系统「建议收藏」码说明1、敏感词库维护更新脚本:reload_dict.php,提供自动更新字典库到trie-tree文件的过程PHP<?php//设置内存ini_set(‘memory_limit’,’128M’);//读取敏感词字典库$handle=fopen(‘dict.txt’,’r’);//生成空的trie-tree-filter$resTrie=trie_filter_new();while(!feof($handle)){$it

大家好,又见面了,我是你们的朋友全栈君。

码说明

1、敏感词库维护更新脚本:

reload_dict.php,提供自动更新字典库到trie-tree文件的过程

PHP

<?php

// 设置内存
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文件与敏感词库的同步更新

PHP

<?php
/**
 * 过滤器助手
 *
 * getResTrie 提供trie-tree对象;
 * getFilterWords 提取过滤出的字符串
 *
 * @author W.Y.P (wangyupeng@jiayuan.com)
 */


class FilterHelper
{

    // trie-tree对象
    private static $_resTrie = null;
    // 字典树的更新时间
    private static $_mtime = null;


    /**
     * 防止初始化
     */
    private function __construct() {}


    /**
     * 防止克隆对象
     */
    private function __clone() {}


    /**
     * 提供trie-tree对象
     *
     * @param $tree_file 字典树文件路径
     * @param $new_mtime 当前调用时字典树的更新时间
     * @return null
     */
    static public function getResTrie($tree_file, $new_mtime) {

        if (is_null(self::$_mtime)) {
            self::$_mtime = $new_mtime;
        }

        if (($new_mtime != self::$_mtime) || is_null(self::$_resTrie)) {
            self::$_resTrie = trie_filter_load($tree_file);
            self::$_mtime = $new_mtime;

            // 输出字典文件重载时间
            echo date('Y-m-d H:i:s') . "\tdictionary reload success!\n";
        }

        return self::$_resTrie;
    }


    /**
     * 从原字符串中提取过滤出的敏感词
     *
     * @param $str 原字符串
     * @param $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

<?php

// 设置脚本最大运行内存,根据字典大小调整
ini_set('memory_limit', '512M');

// 设置时区
date_default_timezone_set('Asia/Shanghai');

// 加载助手文件
require_once('FilterHelper.php');

// http服务绑定的ip及端口
$serv = new swoole_http_server("182.92.177.16", 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();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130918.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月13日 上午8:46
下一篇 2022年6月13日 上午9:00


相关推荐

  • 什么,缺“Java项目经验”找不到工作?锋哥送你80个“项目经验”[通俗易懂]

    什么,缺“Java项目经验”找不到工作?锋哥送你80个“项目经验”[通俗易懂]很多学计算机小伙伴从校园刚出来,因为没有项目经验,找工作出出碰壁,尤其是普通大学大专和本科。今天锋哥送80个“Java项目经验”给你,无套路,谢谢;看看下面的“惨剧”就知道:没项目经验,找不到工作没有项目经验,得不到面试机会对于普通大学毕业的大专或者本科生,要想找份好实习单位或者工作,还真得搞点“项目经验”,至少能有面试机会,最终才能有工作机会;经常有应届生找我,说“锋哥啊,给点项目经验啊,实在编不出来”;今天“它来了”,一次性给你80个;(资源来自互联网)截图几个大伙看看:.

    2022年6月12日
    42
  • 微信公众平台宣布增加接口IP白名单提高安全性

    微信公众平台宣布增加接口IP白名单提高安全性

    2021年10月12日
    47
  • redis 消息队列 延时队列

    redis 消息队列 延时队列Springboot2 0 基于 Redis 快速实现消息队列 pub sub 功能 Springboot Redis 实现消息队列 生产者 消费者 发布订阅模式 SpringBoot 基于事件的 Redis 消息队列实现异步操作 redis 实现消息队列 Redis 发布订阅传对象消息队列 基于 Redisson SpringBoot 整合 Redis 延时队列的简单实现 基于有赞的设计 延时队列 基于 Redisson 实现的延时队列生成订单 30 分钟未支付 则自动取消 该怎么实现 Redis 实现关闭订单

    2026年3月18日
    1
  • jQuery中AJAX写法「建议收藏」

    jQuery中AJAX写法「建议收藏」前言  在jQuery中AJAX的写法有3种,$ajax,$post,$get这三种。其中$post和$get是简易写法,高层的实现,在调用他们的时候,会运行底层封装好的$ajax。运用get方式一$.get("test.cgi",{name:"John",time:"2pm"},function(data){alert("DataLoaded:"+data…

    2026年4月19日
    5
  • Mysql 主从复制 作用和原理

    Mysql 主从复制 作用和原理一、什么是主从复制?主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的业务数据库。您看,像在mysql数据库中,支持单项、异步赋值。在赋值过程中,一个服务器充当主服务器,而另外一台服务器充当从服务器。此时主服务器会将更新信息写入到一个特定的二进制文件中。并会维护文件的一个索引用来跟踪日志循环。这个日志可以记录并发送到从服务器的更新中去。当一台从服务器连…

    2022年4月19日
    41
  • uni-app 103退出和解散群聊(一)

    uni-app 103退出和解散群聊(一)route.js//删除并退出群聊router.post(‘/group/quit’,controller.group.quit);app/controller/group.js’usestrict’;constController=require(‘egg’).Controller;classGroupControllerextendsController{//获取群聊列表asynclist(){const{ct.

    2022年5月19日
    102

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号