PHP中用pathinfo()获取文件后缀时,需先规范化路径再提取:先统一斜杠、压缩重复斜杠、去除末尾斜杠,再调用pathinfo($path, PATHINFO_EXTENSION),否则可能返回空或误判。

PHP中用pathinfo()获取文件后缀时,若输入路径含多余斜杠(如/var/www//index.php或././config.ini),默认行为可能误判扩展名或返回空字符串,需确保路径先规范化再提取后缀。
先标准化路径再取后缀
第一步:用realpath()将路径转为绝对规范路径,自动合并重复斜杠、解析.和..,同时验证路径是否存在——但若文件不存在会返回false,不适用临时构造路径场景。
第二步:改用str_replace() + preg_replace()手动清理斜杠。先替换Windows风格反斜杠为正斜杠,再用正则//+/<font color="red">/g</font>把连续多个/压成单个,最后用rtrim()去掉末尾斜杠——这步很关键,否则pathinfo('dir//file.txt/', PATHINFO_EXTENSION)会返回空。
第三步:调用pathinfo($cleaned_path, PATHINFO_EXTENSION)获取后缀。此时路径已无冗余分隔符,结果稳定可靠。
立即学习“PHP免费学习笔记(深入)”;
用basename配合substr定位后缀
方法一:直接用basename()剥离路径,再用strrpos()找最后一个点位置。
$filename = basename($path); $ext = strrpos($filename, '.') !== false ? substr($filename, strrpos($filename, '.') + 1) : '';
注意:【此法不校验点是否在文件名开头或中间,如.gitignore会返回gitignore】,需额外判断substr($filename, 0, 1) === '.'来规避隐藏文件误判。
方法二:用explode()按点分割,取最后一段,但要排除空段——$parts = array_filter(explode('.', $filename)); $ext = !empty($parts) ? end($parts) : '';。这一步操作起来很简单,直接把文件名切开就行,但array_filter()会丢掉所有空值,比如file..txt会被误判为txt而非空。
封装成健壮函数
定义函数get_extension($path),内部先trim($path)去首尾空白,再用str_replace(['\', '//'], '/', $path)统一分隔符,接着preg_replace('#/+#', '/', $path)压缩斜杠,然后rtrim($path, '/')削尾部斜杠,最后走pathinfo(..., PATHINFO_EXTENSION)。整个流程不依赖文件存在性,也不怕路径里混入../或./。
这一步必须做rtrim($path, '/'),否则pathinfo('a/b/c/.env/', PATHINFO_EXTENSION)返回空字符串——因为pathinfo认为/结尾的路径没有扩展名。



















