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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:20:19