You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP7升级后preg_replace_callback替换敏感词星号数量不符求助

解决preg_replace_callback替换敏感词星号数量错误的问题

嗨,我一眼就瞅出问题所在啦!你现在的回调函数里写的是strlen('$0'),这里的'$0'是个固定的字符串,长度就是2,所以才会输出两个星号~

在preg_replace_callback的回调函数里,匹配到的内容是通过传入的$matches数组来获取的:

  • $matches[0]代表整个匹配到的敏感词内容
  • 如果正则里有分组,$matches[1]、$matches[2]对应各个分组的内容

所以你只需要把回调里的strlen('$0')改成strlen($matches[0]),就能得到和敏感词长度一致的星号了!

修正后的代码

echo filterwords("I am a dummy");

function filterwords($text) {
    $filterWords = array("dummy");
    foreach ($filterWords as $word) {
        // 用preg_quote转义敏感词,避免正则特殊字符干扰匹配
        $text = preg_replace_callback('/\b' . preg_quote($word, '/') . '\b/i', function ($matches) {
            return str_repeat('*', strlen($matches[0]));
        }, $text);
    }
    return $text;
}

额外优化建议

还有个小细节要注意:直接把敏感词拼进正则时,最好用preg_quote()处理一下,避免敏感词里包含.、*这类正则特殊字符,导致匹配逻辑出错。

如果你的敏感词数量较多,还可以把所有敏感词拼成一个正则表达式,不用循环多次调用preg_replace_callback,效率会更高:

function filterwords($text) {
    $filterWords = array("dummy", "test");
    // 批量转义敏感词并拼接成正则
    $pattern = '/\b(' . implode('|', array_map('preg_quote', $filterWords, array_fill(0, count($filterWords), '/'))) . ')\b/i';
    
    return preg_replace_callback($pattern, function ($matches) {
        return str_repeat('*', strlen($matches[1]));
    }, $text);
}

这样修改后,输入I am a dummy就能得到你期望的I am a *****啦!

内容的提问来源于stack exchange,提问作者626

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:48:47