php获取文件名-文件后缀-文件扩展名

  1. 第1种方法:
  2. function get_extension($file)
  3. {
  4.   substr(strrchr($file, '.'), 1);
  5. }
  6. 第2种方法:
  7. function get_extension($file)
  8. {
  9.   return substr($file, strrpos($file, '.')+1);
  10. }
  11. 第3种方法:
  12. function get_extension($file)
  13. {
  14.   return end(explode('.', $file));
  15. }
  16. 第4种方法:
  17. function get_extension($file)
  18. {
  19. $info = pathinfo($file);
  20. return $info['extension'];
  21. }
  22. 第5种方法:
  23. function get_extension($file)
  24. {
  25. return pathinfo($file, PATHINFO_EXTENSION);
  26. }
  27. 第6中方法:
  28. 如果知道是图片
  29. function get_extension($file){
  30. return getimagesize($file);
  31. }

在您列出的方法中,第5种方法是PHP 7中最推荐、最安全且最可靠的方式

  1. function get_extension($file)
  2. {
  3. return pathinfo($file, PATHINFO_EXTENSION);
  4. }

🏆 为什么第5种方法最好?

pathinfo() 函数是PHP官方推荐的用于解析文件路径的内置函数,它专门为此类任务设计,能够智能地处理各种复杂的边界情况,而手动字符串操作则容易出错。

✅ 优点:健壮性高

它能正确处理多种特殊文件名,而这些往往是其他方法的“陷阱”:

  • 多点文件名: 对于 archive.tar.gzimage.jpeg.bak,它能准确返回最后一个点之后的部分(gz, bak)。
  • 无扩展名文件: 对于 README/path/to/file 这类没有后缀的文件,它会安全地返回一个空字符串,而不是报错。
  • 隐藏文件: 对于以点开头的文件如 .htaccess.gitignore,它能正确识别并返回 htaccessgitignore,不会将其误判为整个文件名就是扩展名。

⚠️ 其他方法的问题

相比之下,您列出的其他方法都存在明显的缺陷:

方法 主要问题
第1、2种 (substr + strrchr/strrpos) 无法正确处理没有扩展名的文件,可能导致意外结果。例如,对 README 使用 strrchr 会返回 false,进而可能触发警告。
第3种 (end(explode())) 效率较低,因为它会将整个字符串分割成数组。更重要的是,它在处理某些边界情况时逻辑复杂,不如 pathinfo 清晰可靠。
第4种 (pathinfo + 数组索引) 虽然使用了 pathinfo,但通过 $info['extension'] 访问数组元素存在风险。当文件没有扩展名时,该键不存在,会触发一个 Notice 级别的错误。
第6种 (getimagesize) 这是一个常见的误解。getimagesize() 函数的作用是获取图片的尺寸等信息,它返回的是一个包含宽、高、类型等信息的数组,并不会返回文件的后缀名

💡 实际应用中的最佳实践

在实际开发中,尤其是在处理文件上传时,仅仅获取扩展名是不够的。为了安全和一致性,建议遵循以下最佳实践:

  1. 统一转换为小写:使用 strtolower() 将扩展名转为小写,避免 JPGjpg 被当作不同类型。
  2. 使用白名单校验:不要依赖黑名单,而是定义一个允许上传的扩展名列表,并使用 in_array() 进行校验。
  1. // 假设 $uploadedFileName 是用户上传的文件名
  2. $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
  3. // 1. 获取扩展名并转为小写
  4. $fileExtension = strtolower(pathinfo($uploadedFileName, PATHINFO_EXTENSION));
  5. // 2. 使用白名单进行校验
  6. if (!in_array($fileExtension, $allowedExtensions)) {
  7. // 扩展名不在允许列表中,拒绝操作
  8. die('不允许的文件类型!');
  9. }
  10. // 如果代码执行到这里,说明文件类型是安全的
  11. echo "文件类型验证通过。";
  1. $path = "/uploads/image/photo.jpg";
  2. // 获取扩展名(不带点号)
  3. $extension = pathinfo($path, PATHINFO_EXTENSION);
  4. echo $extension; // 输出: jpg
  5. // 获取基本文件名(包含扩展名,即名称+点+后缀)
  6. $basename = pathinfo($path, PATHINFO_BASENAME);
  7. echo $basename; // 输出: photo.jpg
  8. // 获取文件名(不含扩展名)
  9. $filename = pathinfo($path, PATHINFO_FILENAME);
  10. echo $filename; // 输出: photo
  11. // 获取目录路径
  12. $dirname = pathinfo($path, PATHINFO_DIRNAME);
  13. echo $dirname; // 输出: /uploads/image