在php中判断字符串是否包含某个关键词,最直接的方法是使用 strpos() 函数。该函数返回关键词在字符串中首次出现的偏移量(从0开始),如果未找到则返回布尔值 false。使用时必须用恒等运算符 === false 进行严格比较,因为当关键词位于字符串开头时,strpos() 会返回 0,而 0 在弱类型比较中会被视为假值,导致逻辑错误。

strpos() 遇到空输入或匹配失败会返回什么
strpos() 在目标字符串为空、关键词为空或确实未找到匹配项时,均返回布尔值 false。开发者常误以为返回 -1 或 0,因此必须通过 === false 来准确识别“不存在”的状态。

$haystack = "Hello World";
$needle = "World";
// 正确写法:严格比较
if (strpos($haystack, $needle) !== false) {
echo "包含关键词";
} else {
echo "不包含关键词";
}
上述代码中,strpos("Hello World", "World") 返回整数 6。由于 6 不等于 false,条件成立,输出“包含关键词”。若将 $needle 改为 "Python",函数返回 false,条件不成立,输出“不包含关键词”。
立即学习“PHP免费学习笔记(深入)”;
如何区分大小写或使用多模式匹配
默认情况下 strpos() 是区分大小写的。若需忽略大小写,应使用 stripos();若需同时匹配多个关键词中的任意一个,可使用正则表达式 preg_match() 配合管道符 | 实现。

// 忽略大小写匹配
if (stripos($haystack, "world") !== false) {
echo "忽略大小写:包含";
}
// 多关键词匹配:匹配 "World" 或 "PHP"
if (preg_match('/(World|PHP)/i', $haystack)) {
echo "多模式:包含";
}
stripos() 的行为与 strpos() 完全一致,只是内部执行不区分大小写的比较。而 preg_match() 返回 1 表示匹配成功,0 表示失败,无需处理偏移量问题,适合复杂或多关键词场景。
基于关键词位于字符串开头时的具体行为
当关键词恰好位于字符串的起始位置(索引 0)时,strpos() 返回整数 0。这是最容易引发 bug 的场景,因为 if (strpos($str, $key)) 会将 0 判定为 false,从而错误地认为关键词不存在。
$haystack = "Keyword at start";
$needle = "Keyword";
// 错误写法:0 被当作 false
if (strpos($haystack, $needle)) {
echo "存在"; // 不会执行
} else {
echo "不存在"; // 错误输出
}
// 正确写法:严格比较
if (strpos($haystack, $needle) !== false) {
echo "存在"; // 正确输出
}
此段代码清晰展示了陷阱:strpos("Keyword at start", "Keyword") 返回 0。在弱比较中 0 == true 为假,故第一个 if 分支跳过;而在严格比较中 0 !== false 为真,第二个 if 分支正确执行。开发者在处理此类逻辑时,务必始终使用 !== false 或 === false 以确保语义正确。



















