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

PHP如何排除指定词语实现句子与数组键的匹配

问题解决:查询语句匹配数组键名(忽略前置内容)

问题说明

需要将用户查询句子匹配到数组的键名,忽略查询语句中的前置内容。例如查询How can I add new booking时,要匹配到键中包含new booking的条目;前置内容可能有变化(如how may i add new booking)。

当前代码存在逻辑颠倒的问题:原代码将完整查询语句作为正则去匹配数组键名,导致只有查询语句完全匹配键名的一部分时才会命中。但实际需求是检查数组键中的任意子模式是否存在于查询语句中,所以匹配逻辑完全搞反了。

修正后的代码

$array = [
    "booking" => "Here you can etc..",
    "new booking|new hotel booking|booking|how to add new booking" => "here you can"
];

$query = "how can i add new booking";
$msg = __('basic.bot no answer'); // 默认无匹配时的回复

// 遍历数组的每个键值对
foreach ($array as $patternsStr => $response) {
    // 将键中用|分隔的多个模式拆分成数组
    $patterns = explode('|', $patternsStr);
    
    // 可选:按模式长度降序排序,优先匹配更精准的长模式
    usort($patterns, function($a, $b) {
        return strlen($b) - strlen($a);
    });
    
    foreach ($patterns as $pattern) {
        // 转义正则特殊字符,构建不区分大小写的匹配规则
        $regex = '/' . preg_quote($pattern, '/') . '/i';
        if (preg_match($regex, $query)) {
            $msg = $response;
            // 找到匹配后直接跳出所有循环
            break 2;
        }
    }
}

echo $msg;

关键改动说明

  1. 颠倒匹配逻辑:不再用查询语句匹配数组键,而是用数组键中的每个子模式去匹配查询语句,满足"忽略前置内容,匹配核心关键词"的需求。
  2. 处理多模式键:将数组键中用|分隔的多个模式拆分,逐个检查是否存在于查询语句中。
  3. 正则安全处理:用preg_quote()转义模式中的特殊字符,避免正则语法错误。
  4. 可选精准优化:对模式按长度降序排序,确保更长、更精准的模式优先匹配(比如new hotel booking会比booking先被检查)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:07:13