strrpos()用于查找字符串中某子串最后一次出现的位置(区分大小写),返回字节偏移量,未找到时返回false,需用===严格判断;支持offset参数控制搜索范围,多字节字符串应使用mb_strrpos()。

strpos() 是找第一次出现的位置,不能用于搜最后一次。要找最后一次出现,必须用 strrpos()(区分大小写)或 strripos()(不区分大小写)。
✅ 正确方式:用 strrpos() 查最后一次出现(区分大小写)
$haystack = "PHP is great, and PHP is fast"; $pos = strrpos($haystack, "PHP"); // 返回 23 —— 第二个 "PHP" 开头的索引(从 0 开始)
- 返回的是字节偏移量(不是字符数),适用于单字节编码(如 ASCII、UTF-8 下纯英文/数字也适用)。
- 找不到时返回
false,务必用=== false判断,避免0被误判:
if ($pos === false) {
echo "没找到";
} else {
echo "最后出现在位置 $pos";
}✅ 大小写不敏感?用 strripos()
$haystack = "I love Php and PHP"; $pos = strripos($haystack, "php"); // 返回 15(第二个 "PHP" 的位置)
- 和
strrpos()行为一致,只是忽略大小写。 - 同样返回
false表示未找到,需严格比较。
⚠️ 注意 offset 参数的实际效果
strrpos($haystack, $needle, $offset) 中:
$offset >= 0:跳过开头$offset字节,再在剩余部分里找最后一次出现
(不是“从第 $offset 位开始往右找最后一次”,而是“在$haystack[$offset...]这个子串里找最后一次”)$offset < 0:从右侧跳过abs($offset)字节,在左侧剩余部分中找最后一次出现
(等价于在$haystack[0, strlen($haystack)+$offset]范围内搜索)
例如:
$str = "abcabcabc"; echo strrpos($str, "abc", -3); // 输出 6 // 因为跳过末尾3字节 → 实际搜索 "abcabc" → 最后一个 "abc" 在位置 6
? 多字节字符串(如中文、emoji)怎么办?
strrpos() 按字节计算,对 UTF-8 中文可能出错(一个汉字占 3 字节)。此时应改用:
立即学习“PHP免费学习笔记(深入)”;
-
mb_strrpos($str, $needle, 0, 'UTF-8')—— 区分大小写,按字符计数 -
mb_strripos($str, $needle, 0, 'UTF-8')—— 不区分大小写
例如:
$str = "你好PHP,再见PHP"; $pos = mb_strrpos($str, "PHP", 0, 'UTF-8'); // 返回 10(第11个字符位置,正确)
不指定 'UTF-8' 且内部编码非默认时,结果不可靠。
❌ 常见误区
- 把
strpos()当成能找“最后一次”的函数 —— 它只找第一次; - 用
== false判断结果 ——0会被当成false,导致首字符匹配失败; - 对中文混排字符串直接用
strrpos()—— 可能切在汉字中间,返回错误位置或false; - 忽略
offset是按字节偏移,不是按字符偏移。
不复杂但容易忽略



















