php获取文件名-文件后缀-文件扩展名
第1种方法:function get_extension($file){substr(strrchr($file, '.'), 1);}第2种方法:function get_extension($file){return substr($file, strrpos($file, '.')+1);}第3种方法:function get_extension($file){return end(explode('.', $file));}第4种方法:function get_extension($file){$info = pathinfo($file);return $info['extension'];}第5种方法:function get_extension($file){return pathinfo($file, PATHINFO_EXTENSION);}第6中方法:如果知道是图片function get_extension($file){return getimagesize($file);}
在您列出的方法中,第5种方法是PHP 7中最推荐、最安全且最可靠的方式。
function get_extension($file){return pathinfo($file, PATHINFO_EXTENSION);}
🏆 为什么第5种方法最好?
pathinfo() 函数是PHP官方推荐的用于解析文件路径的内置函数,它专门为此类任务设计,能够智能地处理各种复杂的边界情况,而手动字符串操作则容易出错。
✅ 优点:健壮性高
它能正确处理多种特殊文件名,而这些往往是其他方法的“陷阱”:
- 多点文件名: 对于
archive.tar.gz或image.jpeg.bak,它能准确返回最后一个点之后的部分(gz,bak)。 - 无扩展名文件: 对于
README或/path/to/file这类没有后缀的文件,它会安全地返回一个空字符串,而不是报错。 - 隐藏文件: 对于以点开头的文件如
.htaccess或.gitignore,它能正确识别并返回htaccess或gitignore,不会将其误判为整个文件名就是扩展名。
⚠️ 其他方法的问题
相比之下,您列出的其他方法都存在明显的缺陷:
| 方法 | 主要问题 |
|---|---|
第1、2种 (substr + strrchr/strrpos) |
无法正确处理没有扩展名的文件,可能导致意外结果。例如,对 README 使用 strrchr 会返回 false,进而可能触发警告。 |
第3种 (end(explode())) |
效率较低,因为它会将整个字符串分割成数组。更重要的是,它在处理某些边界情况时逻辑复杂,不如 pathinfo 清晰可靠。 |
第4种 (pathinfo + 数组索引) |
虽然使用了 pathinfo,但通过 $info['extension'] 访问数组元素存在风险。当文件没有扩展名时,该键不存在,会触发一个 Notice 级别的错误。 |
第6种 (getimagesize) |
这是一个常见的误解。getimagesize() 函数的作用是获取图片的尺寸等信息,它返回的是一个包含宽、高、类型等信息的数组,并不会返回文件的后缀名。 |
💡 实际应用中的最佳实践
在实际开发中,尤其是在处理文件上传时,仅仅获取扩展名是不够的。为了安全和一致性,建议遵循以下最佳实践:
- 统一转换为小写:使用
strtolower()将扩展名转为小写,避免JPG和jpg被当作不同类型。 - 使用白名单校验:不要依赖黑名单,而是定义一个允许上传的扩展名列表,并使用
in_array()进行校验。
// 假设 $uploadedFileName 是用户上传的文件名$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];// 1. 获取扩展名并转为小写$fileExtension = strtolower(pathinfo($uploadedFileName, PATHINFO_EXTENSION));// 2. 使用白名单进行校验if (!in_array($fileExtension, $allowedExtensions)) {// 扩展名不在允许列表中,拒绝操作die('不允许的文件类型!');}// 如果代码执行到这里,说明文件类型是安全的echo "文件类型验证通过。";
$path = "/uploads/image/photo.jpg";// 获取扩展名(不带点号)$extension = pathinfo($path, PATHINFO_EXTENSION);echo $extension; // 输出: jpg// 获取基本文件名(包含扩展名,即名称+点+后缀)$basename = pathinfo($path, PATHINFO_BASENAME);echo $basename; // 输出: photo.jpg// 获取文件名(不含扩展名)$filename = pathinfo($path, PATHINFO_FILENAME);echo $filename; // 输出: photo// 获取目录路径$dirname = pathinfo($path, PATHINFO_DIRNAME);echo $dirname; // 输出: /uploads/image
