在 PHP 中,stripos() 是一个非常常用的函数,用于不区分大小写地查找字符串在另一个字符串中首次出现的位置。如果找到了,stripos() 会返回一个整数,表示匹配字符串在目标字符串中的起始位置;如果没找到,则返回 false。
这里的问题就来了:由于返回的是“0 或 false”,在条件判断中很容易出错。
举个常见的坑:
if (stripos($haystack, $needle)) {
echo "找到了!";
} else {
echo "没找到!";
}
这段代码如果 $needle 在 $haystack 的开头(位置为 0),stripos() 返回 0,而 if (0) 会被当作 false,导致“没找到”的输出,逻辑错误!
要优雅地处理 stripos() 返回 false 的情况,我们应该明确判断是否为 false,而不是简单的布尔值判断:
$pos = stripos($haystack, $needle);
if ($pos !== false) {
echo "找到了,在位置:$pos";
} else {
echo "没找到!";
}
通过使用全等比较符 !==,我们可以精准地区分 0 和 false。
为了让代码更清晰、可重用,我们可以封装一个辅助函数:
function containsIgnoreCase($haystack, $needle) {
return stripos($haystack, $needle) !== false;
}
// 使用示例
if (containsIgnoreCase("https://m66.net/news", "NEWS")) {
echo "包含关键词!";
} else {
echo "不包含关键词!";
}
这样写代码既易读又减少了重复逻辑,非常适合在项目中广泛使用。
假设我们需要判断用户访问的 URL 是否包含 utm_source: