应根据是否需要忽略大小写来选择:需精确匹配(如密钥校验)用strpos,需模糊匹配(如用户搜索)用stripos;二者均须用!== false判断返回值,且中文等多字节字符串须改用mb_strpos或mb_stripos。

用 strpos 还是 stripos?先看需求再选函数
PHP 里区分大小写查找,核心就两条路:strpos(区分)和 stripos(不区分)。别凭感觉选,得看业务是否允许“Hello”匹配“hello”。比如校验 API 密钥、解析协议头、比对哈希值,必须用 strpos;而处理用户搜索词、邮箱域名提取、配置项模糊匹配,stripos 更安全。
strpos 返回 false 时容易误判为 0
这是最常踩的坑:当子串出现在主串开头(位置 0),strpos 返回整数 0;没找到时返回布尔值 false。但 if ($pos) 会把 0 当作假值跳过,导致逻辑错误。
- ✅ 正确判断方式:
if ($pos !== false) - ❌ 错误写法:
if ($pos)或if ($pos != false) - 示例:
$pos = strpos("apple", "a");→ 返回0,不是没找到
strstr 和 stristr 的区别不只是大小写
这两个函数不只返回位置,而是返回匹配点之后(或之前)的子串,适合提取内容。它们的大小写行为和 strpos/stripos 一一对应:
-
strstr("User@EXAMPLE.COM", "@")→ 返回"@EXAMPLE.COM"(严格匹配) -
stristr("User@EXAMPLE.COM", "@")→ 同样返回"@EXAMPLE.COM"(忽略大小写,但这里没影响) -
stristr("HTTP/1.1 200 OK", "200")→ 返回"200 OK",哪怕原始是"200 ok"也成立 - 第三个参数设为
true时,两者都返回匹配前的部分,例如strstr("file.txt", ".", true)→"file"
多字节字符(如中文)不能直接用 strpos
strpos 是二进制安全的,但它按字节计算偏移,遇到 UTF-8 中文就会错位。比如 strpos("你好world", "world") 可能返回错误位置,甚至找不到。
- ✅ 中文/emoji/日文场景必须换
mb_strpos($str, $needle, 0, 'UTF-8') - ⚠️
mb_strpos第三个参数是起始位置(字符数,非字节数),第四个参数必须显式指定编码 -
stripos对应的是mb_stripos,同样要传编码
实际开发中,大小写敏感性往往不是孤立问题——它常和编码、返回值类型、性能(stripos 比 strpos 略慢,因需内部转小写)缠在一起。别只改一个函数名,顺手检查下判断逻辑、编码支持、以及你到底要不要那个“W”和“w”的差别。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











