PHP IF语句逻辑问题:多字符串匹配后仅全不匹配执行else
解决多字符串关键词匹配及高亮问题
你当前代码的核心问题是:最后那个else只和最后一个if绑定,不管前面的字符串有没有匹配到关键词,只要最后一个字符串没匹配,就会触发"No such word",完全不符合「所有字符串都没匹配才输出提示」的需求。
修正思路
新增一个标记变量记录是否找到匹配,所有字符串检查完成后,再根据这个变量判断是否输出提示。另外要注意:stripos如果在字符串开头找到关键词会返回0,直接用if(stripos(...))会把0当成false,必须用!== false做严格判断。
修正后的代码
<?php // 初始化标记变量,默认未找到匹配 $found = false; // 检查并处理第一个字符串 if (stripos($str, $text)!== false) { $str = preg_replace("/\b([a-z]*${fwcode}[a-z]*)\b/i", "<font color='red'><b>$1</b></font>", $str); echo $str . "<br>"; $found = true; } // 检查并处理第二个字符串 if (stripos($str2, $text)!== false) { $str2 = preg_replace("/\b([a-z]*${fwcode}[a-z]*)\b/i", "<font color='red'><b>$1</b></font>", $str2); echo $str2; $found = true; } // 检查并处理第三个字符串 if (stripos($str3, $text)!== false) { $str3 = preg_replace("/\b([a-z]*${fwcode}[a-z]*)\b/i", "<font color='red'><b>$1</b></font>", $str3); echo $str3; $found = true; } // 检查并处理第四个字符串 if (stripos($str4, $text)!== false) { $str4 = preg_replace("/\b([a-z]*${fwcode}[a-z]*)\b/i", "<font color='red'><b>$1</b></font>", $str4); echo $str4; $found = true; } // 所有检查完成后,判断是否完全没有匹配 if (!$found) { echo "No such word"; } ?>
关键说明
$found变量全程追踪匹配状态,只要有一个字符串匹配到关键词就设为true- 每个
stripos判断用!== false,避免关键词在字符串起始位置时的误判 - 把原来绑定在最后一个if的else,改成统一检查
$found的独立if语句,确保只有所有字符串都没匹配时才输出提示
内容的提问来源于stack exchange,提问作者Kris Ivanov
相关产品推荐
相关产品推荐

