如何在PHP中实现不区分大小写的黑名单关键词匹配?
黑名单关键词不区分大小写匹配实现方案
首先说下你的原脚本:stripos() 本身就是不区分大小写的字符串查找函数,所以你的代码其实已经能捕获大小写混合的关键词了,比如"PERV""nAsty"这些都能被检测到。不过可以根据你的两种需求(匹配子串/匹配独立词)做针对性优化:
需求1:匹配关键词作为子串(比如"badword"里的"word"也会被拦截)
如果只是要检测关键词是否出现在消息里(不管是不是单独的词),除了原脚本的写法,也可以用你说的转小写的方式,两种写法效果一致:
$words_arr = ['word', 'nasty', 'perv']; $included = []; $lower_message = strtolower($message); foreach($words_arr as $word) { $lower_word = strtolower($word); if (strpos($lower_message, $lower_word) !== false) { $included[] = $word; } }
这种写法和用stripos()的区别不大,选哪种都可以。
需求2:匹配独立关键词(只拦截单独的单词,比如"badword"里的"word"不触发)
如果要确保关键词是独立的单词(不是其他词的一部分),就得用正则表达式,利用单词边界\b,同时开启不区分大小写模式i:
$words_arr = ['word', 'nasty', 'perv']; $included = []; // 把关键词转成正则匹配规则,注意转义特殊字符 $pattern = '/\b(' . implode('|', array_map('preg_quote', $words_arr)) . ')\b/i'; // 查找所有匹配的关键词 preg_match_all($pattern, $message, $matches); // 去重并整理结果 if (!empty($matches[1])) { $included = array_unique($matches[1]); }
这里用preg_quote()是为了避免关键词里有正则特殊字符(比如"$"".")导致匹配出错,\b用来匹配单词边界,i模式确保不区分大小写。
内容的提问来源于stack exchange,提问作者LOTUSMS
相关产品推荐
相关产品推荐

