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
相关产品推荐
相关产品推荐

