PHP 7.4 中 strpos() 查找子串必须用 !== false 判断是否找到,因成功返回整数(含0)而失败返回 false,弱比较会导致位置0被误判为未找到;中文需用 mb_strpos() 并指定 UTF-8 编码。

PHP 7.4 中用 strpos() 搜索字符串时,若子串恰好出现在开头(位置为 0),弱比较会把它当成 false,导致“明明找到了却判断为没找到”。核心解法是:**一律用严格比较 !== false 或 === false,绝不用 == false、!= false 或直接作为布尔值使用**。
必须用 !== false 判断“是否找到”
因为 strpos() 成功时返回整数(含 0),失败时返回布尔 false。PHP 松散比较下,0 == false 为 true,逻辑就翻车了。
- ✅ 正确:
if (strpos($str, 'x') !== false) { /* 找到了 */ } - ❌ 错误:
if (strpos($str, 'x')) { /* 位置0时跳过 */ } - ❌ 错误:
if (strpos($str, 'x') == false) { /* 位置0时误进分支 */ }
中文或 UTF-8 字符要换 mb_strpos()
strpos() 按字节匹配,UTF-8 中一个中文占 3 字节,直接搜 `'你好'` 很可能返回 false(不是没找到,是字节对不上)。
- 改用:
mb_strpos($str, '你好', 0, 'UTF-8'),第四个参数'UTF-8'不能省 - 返回值判断规则完全一致:
!== false,不可省略严格比较 - 避免用已废弃的
iconv_strpos(),行为不统一
其他类似函数也遵守同一规则
所有以“位置索引”为成功返回值、失败返回 false 的字符串查找函数,都必须用严格比较:
立即学习“PHP免费学习笔记(深入)”;
-
stripos()(不区分大小写)→!== false -
strrpos()(从右往左找)→ 注意'.gitignore'中第一个点在位置 0,== false会误判 -
mb_stripos()、mb_strrpos()→ 同样需!== false,且指定编码
替代方案:PHP 8+ 可用 str_contains(),但 7.4 不支持
PHP 8.0+ 提供了语义清晰的 str_contains($str, $needle),直接返回布尔值,无需处理 0 和 false 的歧义。但在 PHP 7.4 环境中不可用,强行调用会报错。
- 如需兼容 7.4,可封装一个简易替代:
function str_contains($haystack, $needle) { return strpos($haystack, $needle) !== false; }- 注意:该封装仍依赖
strpos,所以内部必须用!== false



















