最稳妥方式是pathinfo($filename, pathinfo_extension),它专为提取扩展名设计,能正确处理多点文件名、无扩展名、路径含点等边界情况,返回结果与系统解析一致。

当你需要从 upload_avatar.png 或 report.v2.0.pdf 这类文件名中快速提取 png 或 pdf,又不想写一堆判断逻辑时,explode() 就成了最直觉、最低门槛的入手方式——它把字符串按点号切成碎片,你只要拿最后一块就行。
用 explode 提取扩展名的基本操作
第一步:调用 explode('.', $filename) 把文件名按点号拆成数组。【注意:如果文件名不含点(如 README),返回的数组只有一个元素,end() 仍会返回它,但此时不是扩展名】
第二步:用 end($array) 取数组末尾值,就是扩展名。
这一步操作起来很简单,直接把文件拖进去就行。
为什么它“看起来”轻松,却容易翻车
方法一:用 end(explode('.', $filename)) 一行搞定
方法二:先赋值再取末尾,更清晰但多写一行
$parts = explode('.', $filename); → $ext = end($parts);
这两种写法在 logo.jpg 上都成立,但在 archive.tar.gz 上就暴露问题:它会返回 gz 而非 tar.gz。如果你的业务要求识别复合后缀(比如 Docker 镜像常用 .tar.gz),这个结果就不对了。
【关键前提:explode 只认第一个分隔符位置,不区分“主扩展名”和“压缩包嵌套后缀”,它根本不知道什么是 MIME 类型或归档规范】
真正安全的替代方案
第一步:用 pathinfo($filename, PATHINFO_EXTENSION)
第二步:该函数内部已处理多点、无点、路径含点等边界情况,返回结果与操作系统实际解析行为一致
第三步:无需额外判断,直接用于 switch 分支或白名单校验
比如 pathinfo('data.backup.zip', PATHINFO_EXTENSION) 返回 zip;pathinfo('no.dot', PATHINFO_EXTENSION) 返回空字符串;pathinfo('/var/www/index.php', PATHINFO_EXTENSION) 依然正确返回 php。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











