php 8.1 中 strpos() 等函数必须用 !== false 判断是否找到,因 0 和 false 松散比较会误判;utf-8 字符串须用 mb_strpos() 并指定 'utf-8' 编码,大小写不敏感时用 stripos 或 mb_stripos,所有类似函数均需严格比较。

在 PHP 8.1 中,strpos() 返回 false 表示“未找到”,但返回 0 表示“找到了,且在开头”——这两个值类型不同(布尔 vs 整数),但松散比较(== 或直接用 if())会把 0 当成 false,导致逻辑翻车。所以判断的核心不是“怎么识别 false”,而是“怎么安全区分 false 和 0”。
必须用 !== false(或 === false)来判断
这是唯一可靠的方式,PHP 官方文档和 PHP 8.1 的行为完全延续这一规则:
-
if (strpos($str, 'x') !== false)→ 找到了(包括位置为 0) -
if (strpos($str, 'x') === false)→ 真没找到 - 绝不能写
if (strpos($str, 'x'))或if (strpos($str, 'x') == false),否则开头匹配就失效
中文或 UTF-8 字符串别用 strpos,改用 mb_strpos
strpos 是按字节查找的,UTF-8 中一个中文占 3 字节,直接查 '你好' 极大概率返回 false(不是真没有,是字节对不上)。PHP 8.1 依然如此,不修复也不兼容:
- 启用
mbstring扩展(PHP 8.1 默认通常已开启) - 改用
mb_strpos($str, '你好', 0, 'UTF-8'),第四个参数'UTF-8'不能省 - 它的返回值规则和
strpos完全一致:找到返回整数(含 0),没找到返回false,所以同样要写!== false
大小写不敏感时用 stripos,判断方式不变
如果要忽略大小写(比如用户搜索、日志匹配),用 stripos() 替代:
-
$pos = stripos('Hello WORLD', 'world');返回6,不是false - 仍需
if ($pos !== false)判断,不能省略严格比较 - 它也不支持中文,UTF-8 场景下仍要搭配
mb_stripos()+'UTF-8'
其他类似函数也遵循同一规则
只要函数设计为“成功返回非负整数、失败返回 false”,就必须用 === 或 !==:
-
strrpos()(找最后一次出现)→strrpos('a.b.c', '.') === false?注意'.gitignore'开头的点会返回0 -
mb_strrpos()、mb_stripos()同理 -
iconv_strpos()已废弃,不建议用;若仍在维护旧代码,也必须=== false
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











