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;
关键改动说明
- 颠倒匹配逻辑:不再用查询语句匹配数组键,而是用数组键中的每个子模式去匹配查询语句,满足"忽略前置内容,匹配核心关键词"的需求。
- 处理多模式键:将数组键中用
|分隔的多个模式拆分,逐个检查是否存在于查询语句中。 - 正则安全处理:用
preg_quote()转义模式中的特殊字符,避免正则语法错误。 - 可选精准优化:对模式按长度降序排序,确保更长、更精准的模式优先匹配(比如
new hotel booking会比booking先被检查)。
内容的提问来源于stack exchange,提问作者Shady Hesham
相关产品推荐
相关产品推荐

