THINKPHP3.2创建敏感词过滤行为类

1.在TP框架对应模块下面创建 WordsFilterBehavior 类、

位置Application/Home/Behavior/下

<?php
namespace Home\Behavior;

use Think\Behavior;
use Think\Log;

class WordsFilterBehavior extends Behavior
{
    public function run(&$params)
    {
        $this->loopFilter($params);
    }

    /**
     * 实现无限极替换
     * @param $params
     * @Author: lihuan
     * @Date: 2020-3-16 14:57
     */
    private function loopFilter(&$params)
    {
        if(is_string($params)){
            $params = $this->filter($params);
        }else if(is_array($params)){
            foreach ($params as $key=>$val){
                if(is_string($val)){
                    $params[$key] = $this->filter($val);
                }else{
                    $this->loopFilter($params[$key]);
                }

            }
        }
    }
    private function filter($string)
    {
        $words = $this->words();
        //$count = 0; //违规词的个数
        //$sensitiveWord = '';  //违规词
        $stringAfter = $string;  //替换后的内容
        $pattern = "/".implode("|",$words)."/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 = "\r\n\t".date('Y-m-d H:i:s')."  原句为 [ {$string} ]<br/>";
//        if($count==0){
//            $log .= "暂未匹配到敏感词!";
//        }else{
//            $log .= "匹配到 [ {$count} ]个敏感词:[ {$sensitiveWord} ]<br/>".
//                "替换后为:[ {$stringAfter} ]";
//        }
//        Log::write($log,self::ERR,'',C('LOG_PATH').date('y_m_d').'_replacewords.log');

        return $stringAfter;
    }

    /**
     * 敏感词词组
     * @return array
     * @Author: lihuan
     * @Date: 2020-3-16 14:40
     */
    private function words()
    {
        return [
            '枪支',
            '弹药',
            '枪'
        ];
    }
}

2.在tags.php配置文件内注册

位置在Application/Config/下

return array(
    // 表单提交过滤敏感词
    'form_submit' => array('Home\Behavior\WordsFilterBehavior')
);

3.在代码库内需要的位置引用

#在文件头引入钩子类
use Think\Hook;

#调用 $data需要操作的数据,字符串或者数组
Hook::listen('form_submit',$data);//这是一个敏感词过滤的测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值