strrpos用于精准定位字符串中最后一个指定字符的位置,适用于提取文件扩展名或域名后缀等依赖末尾分隔符的场景;它从右向左搜索,返回从0开始的字节索引,未找到时返回false,需用!== false严格判断。

当你需要提取文件扩展名或域名后缀这类依赖“最后一个点”的结构时,用 strrpos 查找最后一个点的位置才能确保结果准确,因为 strpos 只会停在第一个点上,而真实场景中路径或域名里往往包含多个点。
为什么 strpos 找第一个点会出错
假设字符串是 "index.php.bak",你用 strpos($str, ".") 得到的是 5(即 "index." 的点),截取后得到 ".php.bak"——这根本不是扩展名,而是错误的长后缀。
同样,"user@example.com" 中 strpos 返回的是 4("user." 的点),而非真正的域名分隔点 "@" 后面那个。
【关键前提】:扩展名、顶级域名、URL 路径片段等语义单位,总是定义在最后一个点之后,不是第一个。
strrpos 精准定位最后一个点
执行 $lastDot = strrpos($str, ".");,对 "config.default.json" 返回 13(最后一个点位置),再用 substr($str, $lastDot) 就能干净拿到 ".json"。
它从右往左扫描,跳过所有中间点,直奔语义终点。这个行为与人类读文件名或域名的习惯完全一致——我们也是看最右边那个点后面的部分。
实战对比:提取扩展名的两种写法
方法一:用 strpos(错误示范)
① $firstDot = strpos($filename, ".");
② $ext = substr($filename, $firstDot);
→ 对 "archive.tar.gz" 返回 ".tar.gz",误把压缩格式当扩展名。
方法二:用 strrpos(正确路径)
第一步:$lastDot = strrpos($filename, ".");
第二步:if ($lastDot !== false) { $ext = substr($filename, $lastDot); }
→ 对 "archive.tar.gz" 返回 ".gz",这才是操作系统和 Web 服务器实际识别的扩展名。
注意:【必须用 !== false 判断】,因为最后一个点可能恰好在开头(如 ".gitignore"),此时 strrpos 返回 0,用 == false 会误判为未找到。











