php敏感词过滤

本文介绍了一种利用PHP实现的高效敏感词过滤方法。通过读取敏感词列表并将其缓存到文件中,该方法能够快速地对文本进行敏感词检测及替换。文章详细解释了如何创建缓存文件以及如何在实际应用中更新缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
header('Content-Type:text/html;charset=utf-8;');
function dmicrotime() {
    return array_sum(explode(' ', microtime()));
}
$t = dmicrotime();

//主要代码开始。
$bd = 'bad_words.txt'; // 敏感词 列表, 每行一个敏感词
$bdc = 'bad_words_cache.php'; // 生成 缓存 文件, cache 目录事先已经建立

$str = "你就是张三么。测试的时候自己替换。"; // 需要处理的内容。

$badwords_last_time = 0; // 预设定 缓存对应的文件日期。

if(file_exists($bdc)) include $bdc; // 除了初次使用, 大多数文件存在。
if($badwords_last_time !== filemtime($bd)) {
    $badwords_array = make_cache($bd, $bdc); // 如果敏感词字典改变,重新生成缓存。大多时候不会执行。
}

echo 'make_cache:<font color="red">',(dmicrotime() - $t),'</font><br />';

$t = dmicrotime();
$s = strtr($str, $badwords_array); // 真正执行敏感词替换的错做。 没有什么比这个更有效的。
echo 'strtr:<font color="red">',(dmicrotime() - $t),'</font><br />';

// 代码结束,显示替换后效果。
echo $s;


// 生成缓存,代码很简单,如果用文本查看生成的文件的话,其实就是一个格式好的敏感词数组。
// 并且手动维护这个缓存文件作为敏感词过滤字典或许更有效。
function make_cache($badwords, $cachefile = null, $enc = 'UTF-8') {
    $file  = file($badwords);
    if(!$file) return false;
    $array = array();
    foreach($file as $k=>$v) {
        $v = trim($v);
        if(!$v) continue;

        // 下面只是生成 敏感词 转换后的格式,如果要求不苛刻,可以简单写成 $array[$k] = '*';
        $s_len = mb_strlen($v, $enc);
        switch ($s_len) {
            // 两个字的敏感词,只替换第二字为'*'
            case 2 : {
                $array[$v] = mb_substr($v, 0,1,$enc) . '*';
                break;
            }
            // 敏感词,一个字,虽然很少。不过可能会有。
            case 1 : {
                $array[$v] = '*';
                break;
            }
            // 其他情况,取首位各一个字,中间根据多少个字替换多少个'*';
            default : {
                $array[$v] = mb_substr($v, 0,1,$enc) . str_repeat('*',($s_len-2)) . mb_substr($v, -1,1,$enc);
            }
        }
    }

    // 保存序列备用。
    if(!$cachefile) $cachefile = $badwords . '_cache.php';
    $str = '<?php $badwords_last_time = ' . filemtime($badwords) . ';$badwords_array = ' . var_export($array,true) . ';';
    file_put_contents($cachefile, $str, LOCK_EX);
    return $array;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值