• 0
  • 0

增强DZ系统内置替换敏感词操作

2021-03-22 669 0 admin 所属分类:Discuz

管理员可以在后台

词语过滤

模块 设置敏感词过滤,虽然可以加{ } 限定匹配的字符长度,但是如果涉及到中英文夹杂的很可能会截取失败造成乱码从而数据丢失。

首先 设置的关键词会存入到 pre_common_word 中 ,之后系统会通过一定的处理写入到sys_cache中以二进制的数据存储。

如果需要修改 只能在替换时判断.

进入 \source\class\discuz\discuz_censor.php

if(!empty($this->censor_words['filter'])) {

之前新增 允许正则替换操作 

foreach($this - > censor_words['filter']['find'] as & $v) {
    if (strpos($v, '/iu') !== false && strpos($v, '/\/') !== false) {
        $str = str_replace(["\\x", "\\w", "\\", "/iu", ".{0,1}"], ["@x", "@w", "", "!!!", ""], $v);
        $str = str_replace(["/i"], [""], $str);
        $str = substr($str, 1);
        $str = str_replace(["!!!", "@@@", "@x", "@w"], ["/iu", ".", "\\x", "\\w"], $str);
        $v = $str;
    }
    unset($v);
}

约定

@@@ 代表元字符. (系统处理后会带上该字符,避免重复需要替换)

中文字符表达式为 [\x{4e00}-\x{9fa5}]

PHP 正则表达式需要带上边界符 / 由于涉及到中文字符替换 需要引入 u 限定

演示如下

/破[\x{4e00}-\x{9fa5}\w]{0,8}解/iu

对界于 破 和 解两个字符之间的字符 最多为8位 做替换 

/刷([\x{4e00}-\x{9fa5}]{1}|@@@)/iu

将 连同 刷 字 将后面的一位字符(可以为汉字和任意字符)替换  

 

 

返回顶部