strpos() 返回0时被误判为false,须用!== false;含中文需用mb_strpos();存在性判断优先用str_contains();数字匹配应先explode再in_array。

因为 strpos() 在子串位于开头时返回 0,而很多人用 == false 或直接当布尔值判断,导致 0 == false 成立,逻辑被跳过——这不是函数出错,是判断方式错了。
必须用严格比较:!== false
PHP 中 0、""、null、false 在松散比较(==)下都等价,但 strpos() 的合法返回值包括 0(表示“在第 0 位找到”),它不等于“没找到”。
- ❌ 错误写法:
if (strpos($str, 'a')) { ... }或if (strpos($str, 'a') == false) - ✅ 正确写法:
if (strpos($str, 'a') !== false) { ... }
含中文时还可能根本查不到
strpos() 是按字节查找的,UTF-8 中一个汉字占 3 字节。如果字符串含中文,strpos() 会把汉字拆成单个字节匹配,大概率失败或返回错误位置。
- 例如:
strpos('你好world', 'world')可能返回false,不是因为没有,而是字节偏移错乱 - ✅ 解决方案:改用
mb_strpos($str, 'world', 0, 'UTF-8'),并显式指定编码
别混淆“存在性判断”和“位置提取”
如果你只关心“有没有”,不需要知道在哪,就该选语义更清晰的函数:
- PHP 8.0+:直接用
str_contains($str, 'xxx'),返回true/false,无歧义 - PHP 7.4:坚持用
strpos()没问题,但务必!== false - 要忽略大小写:用
stripos(),同样必须!== false
小数字、逗号分隔场景要特别小心
比如判断 "3,24,57" 是否含数字 "7",strpos() 会命中 "57" 里的 "7",造成误判。
- 这不是
strpos()的 bug,是它本就不该用于“独立元素”匹配 - ✅ 正确做法:先
explode(',', $str)转数组,再用in_array('7', $arr, true)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











