php更好的方法来处理文件扩展名

时间:2012-10-29 00:30:29

标签: php filenames

  

可能重复:
  How to extract a file extension in PHP?
  Get the file extension (basename?)

尝试从其他人的代码中学习,我看到很多方法从它的扩展中剥离文件名,但是大多数方法似乎过于局部化,因为它们假设某种条件。例如:

这将假定只有3个字符的扩展名(例如.txt.jpg.pdf

substr($fileName, 0, -4);

 substr($fileName, 0, strrpos($fileName, '.')); 

但这可能会导致.jpeg.tiff .html等文件名出现问题。或仅限2 .js.pl

(浏览this list显示一些文件名只能包含1个字符,有些文件名只能包含10个字符(!)

我看到的其他一些方法依赖于点(.

例如:

  return key(explode(“.”, $filename));

可能会导致20121029.my.file.name.txt.jpg

等文件名出现问题

同样在这里:

return preg_replace('/\.[^.]*$/', '', $filename);

有些人使用pathinfo($file)和/或basename()(它总是安全的吗?)

basename($filename);

以及许多其他方法..

所以我的问题有几个部分:

  • “剥离”文件扩展名的最佳方法是什么? (有点)

  • “获取”文件扩展名(没有点)和/或检查文件扩展名的最佳方式

  • php自己的函数(basename)会识别所有扩展,无论它们有多么奇特或文件名是如何构造的?

  • 操作系统对此事有何影响? (win,linux,unix ......)

  • 所有那些我希望得到答案的小问题可以归结为一个整体的单个问题: 是否有防弹,整体,始终工作,防故障,最佳实践,über_function,可以在所有条件下工作?

编辑我 - another file extension list

1 个答案:

答案 0 :(得分:3)

引用重复问题的最佳答案:

$ext = pathinfo($filename, PATHINFO_EXTENSION);

这是最好的方式。它由操作系统提供,您可以做到最好。我不知道它不起作用的情况。

一个例外是包含.的文件扩展名。但没有理智的人会引入这样的文件扩展名,因为它会破坏到处加上它会打破隐含的约定。

  

例如在文件20121021.my.file.name.txt.tar.gz中 - tar.gz将是扩展..

不,这简单得多 - 也许这是你担忧的根源。 20121021.my.file.name.txt.tar.gz的扩展名为.gz。它是一个gzip压缩.gz文件,用于所有意图和目的。只有在解压缩后,它才会成为.tar文件。在此之前,文件名中的.tar毫无意义,仅用作gunzip工具的信息。没有名为.tar.gz的文件扩展名。

也就是说,检测文件扩展名无法帮助您确定文件是否实际上是它声称的类型。但我相信你知道这一点,只是把这个放在未来的读者身上。