PHP实现的敏感词过滤方法

PHP实现的敏感词过滤方法,有好的编码和好的实现方法,可以发出来一起交流一下。以下是一份过滤敏感词的编码

🌳🌳🌳个人博客:Harvey的个人博客 🌲🌲🌲

一.敏感词过滤方案一

  /**
     * @todo敏感词过滤,返回结果
     * @paramarray $list 定义敏感词一维数组
     * @paramstring $string 要过滤的内容
     * @returnstring $log 处理结果
     */

    function sensitive($list, $string)
    {

        $count = 0; //违规词的个数

        $sensitiveWord = ''; //违规词

        $stringAfter = $string; //替换后的内容

        $pattern = "/" . implode("|", $list) . "/i"; //定义正则表达式

        if (preg_match_all($pattern, $string, $matches)) { //匹配到了结果

            $patternList = $matches[0]; //匹配到的数组

            $count = count($patternList);

            $sensitiveWord = implode(',', $patternList); //敏感词数组转字符串

            $replaceArray = array_combine($patternList, array_fill(0, count($patternList), '*')); //把匹配到的数组进行合并,替换使用

            $stringAfter = strtr($string, $replaceArray); //结果替换

        }

        $log = "原句为 [ {$string} ]";

        if ($count == 0) {

            $log .= "暂未匹配到敏感词!";

        } else {

            $log .= "匹配到 [ {$count} ]个敏感词:[ {$sensitiveWord} ]
" .

                "替换后为:[ {$stringAfter} ]";

        }

        return $log;

    }

    //调用方法

    function testAction()
    {

        $string = 'likeyou小白喜欢小黑爱着的大黄'; //要过滤的内容

        $list = ['小明', '小红', '大白', '小白', '小黑', 'me', 'you']; //定义敏感词数组

        $result = $this->sensitive($list, $string);

        echo($result);


        //打印结果:

        /*
        
        原句为 [ likeyou小白喜欢小黑爱着的大黄 ]
        
        匹配到 [ 3 ]个敏感词:[ you,小白,小黑 ]
        
        替换后为:[ like**喜欢*爱着的大黄 ]
        
        */

    }

二.敏感词过滤方案二

在网上查了下敏感词过滤方案,找到了一种名为DFA的算法,即Deterministic Finite Automaton算法,翻译成中文就是确定有穷自动机算法。它的基本思想是基于状态转移来检索敏感词,只需要扫描一次待检测文本,就能对所有敏感词进行检测,所以效率比方案一高不少。

假设我们有以下5个敏感词需要检测:傻逼、傻子、傻大个、坏蛋、坏人。那么我们可以先把敏感词中有相同前缀的词组合成一个树形结构,不同前缀的词分属不同树形分支,在Java中,我们可以用HashMap来存储上述的树形结构,还是以上述敏感词为例,我们把每个敏感词字符串拆散成字符,再存储到HashMap中。

三.敏感词过滤方案三

方案二在性能上已经可以满足需求了,但是却很容易被破解,比如说,我在待检测文本中的敏感词中间加个空格,就可以成功绕过了。要解决这个问题也不难,有一个简单的方法是初始化一个无效字符库,比如:空格、*、#、@等字符,然后在检测文本前,先将待检测文本中的无效字符去除,这样的话被检测字符就不存在这些无效字符了,因此还是可以继续用方案二进行过滤。只要被检测文本不要太长,那么我们只要在方案二的基础上再多扫描一次被检测文本去除无效字符就行了,这个性能损耗也还是可以接受的。

如果敏感词是英文,则还要考虑大小写的问题。有一个比较简单的解决方案是在初始化敏感词时,将敏感词都以小写形式存储。同时,在检测文本时,也统一将待检测文本转化为小写,这样就能解决大小写的问题了。

比较棘手的是中文跟拼音混合的情况,比如“傻逼”这个敏感词,可以通过“sha逼”这种中文跟拼音混合的方式轻松绕过,对于这种情况我目前还没想到比较好的解决方案,有想法的读者可以在文末留言。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值