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);//这是一个敏感词过滤的测试