最推荐用 pathinfo($filename, PATHINFO_EXTENSION),安全可靠;substr()+strrpos()需手动处理边界易出错;explode()等方法无法正确识别多级后缀如tar.gz。

PHP 获取文件后缀,最推荐用 pathinfo(),它专为解析路径设计,安全可靠;substr() 配合 strrpos() 也能实现,但需手动处理边界情况,容易出错。
用 pathinfo() 提取后缀(推荐)
pathinfo() 是 PHP 内置函数,能准确分离路径各部分。获取后缀只需指定 PATHINFO_EXTENSION 选项:
$ext = pathinfo($filename, PATHINFO_EXTENSION);- 支持带多级目录的完整路径,如
/var/www/a.b.c.txt→ 返回txt - 自动忽略末尾点号或无扩展名情况,如
file.或readme→ 返回空字符串,不会报错 - 不区分大小写,但返回值保持原样(即保留原始大小写)
用 substr() + strrpos() 手动截取(慎用)
若坚持用字符串函数,必须先找到最后一个点的位置,再向后截取:
-
$pos = strrpos($filename, '.');—— 找最后一点;返回false表示没点 $ext = ($pos !== false) ? substr($filename, $pos + 1) : '';- 注意:
substr($filename, -4)这类固定长度方式不可靠,因为后缀长度不固定(如tar.gz、jpeg) - 还要额外判断点是否在文件名开头(如
.gitignore),否则会误取gitignore为后缀
常见误区提醒
避免这些典型错误:
立即学习“PHP免费学习笔记(深入)”;
- 用
explode('.', $filename)取最后一段 —— 遇到archive.tar.gz会返回gz(可能正确),但config.example.php也只取php,看似没问题,实则丢失了多段后缀语义;更糟的是file.name.txt和/path/to.file.txt在 explode 下行为不一致 - 忽略路径中目录名含点的情况,比如
/home/user.v2/file.txt,strrpos仍能准确定位文件名里的点,而explode容易误判 - 没检查
strrpos返回false就直接传给substr,导致警告或意外结果
需要兼容多后缀?可选方案
像 .tar.gz 这类复合后缀,pathinfo() 默认只返回 gz。如需识别双后缀,可结合 pathinfo() 和二次判断:
- 先取
$ext = pathinfo($filename, PATHINFO_EXTENSION); - 再取去掉该后缀后的文件名:
$name = pathinfo($filename, PATHINFO_FILENAME); - 对
$name再次调用pathinfo(..., PATHINFO_EXTENSION),看是否还有常见前缀(如tar、zip) - 或使用正则匹配常见组合:
preg_match('/\.(tar\.gz|tar\.bz2|zip)$/i', $filename, $matches)



















