strripos不区分大小写且从右向左找最后一次出现,strpos区分大小写且从左向右找第一次出现;二者均返回位置索引或false,需用!==判断结果。

strripos 找最后一次出现的位置,strpos 找第一次出现的位置;而且两者都**不区分大小写**——等等,这个说法错了。
准确说:strripos 是不区分大小写的“从右往左找最后一次”,而 strpos 是区分大小写的“从左往右找第一次”。关键差异不在“有无 i”,而在“i 的含义 + 搜索方向 + 出现顺序”。
核心区别一:大小写敏感性
带 i 的函数(如 strripos、stripos、stristr)全部忽略大小写;不带 i 的(如 strpos、strstr)严格区分大小写。
-
strpos('Hello World', 'h')→ false(找不到小写 h) -
strripos('Hello World', 'h')→ 0(找到 H,位置是 0)
核心区别二:搜索方向与匹配次数
strpos 从字符串开头向后扫描,返回第一个匹配项的起始位置;strripos 从字符串末尾向前扫描,返回最后一个匹配项的起始位置(注意:仍是相对于开头的索引,不是倒序索引)。
-
strpos('a-b-c-d-a', 'a')→ 0 -
strripos('a-b-c-d-a', 'A')→ 8(末尾那个 a,不区分大小写) -
strpos('PHP is great, PHP rocks', 'php')→ false -
strripos('PHP is great, PHP rocks', 'php')→ 18(第二个 PHP 的位置)
实际使用要注意的细节
两者都返回整数位置或 false,不能用 == 判断结果,必须用 === 或 !== 避免类型混淆:
-
if (strpos($str, 'x') !== false)✅ 安全 -
if (strpos($str, 'x') == false)❌ 0 会被当成 false
PHP 8.3 中行为完全兼容旧版,没有新增语义变更,但错误抑制符 @ 在严格模式下更易暴露问题,建议直接处理 false 情况而非屏蔽警告。
怎么选?看需求场景
- 要找文件扩展名(如
.jpg),用strripos更稳妥——不管前面有没有同名子串 - 要判断是否以某前缀开头,用
str_starts_with()(PHP 8.0+)更清晰,比strpos(..., 0) === 0更可读 - 要提取域名后缀(如
@gmail.com最后一次出现),strripos+substr是常见组合 - 做简单存在性检查且不关心位置,
str_contains()(PHP 8.0+)比两个函数都简洁
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











