-1

可能重复:
如何在 PHP 中提取文件扩展名?
获取文件扩展名(基本名称?)

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

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

substr($fileName, 0, -4);

或者

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

但这可能会导致文件名出现问题,例如.jpeg, .tiff .html。或只有 2 个喜欢.js.pl

(浏览此列表显示某些文件名只能有 1 个字符,而有的则多达 10 个(!))

我见过的其他一些方法依赖于这一点(.

例如 :

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

可能会导致文件名出现问题,例如20121029.my.file.name.txt.jpg

同样在这里 :

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

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

basename($filename);

和许多其他方法..

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

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

  • “获取”文件扩展名(没有重点)和/或检查它的最佳方法是什么

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

  • 如果操作系统对此事有任何影响怎么办?(赢,linux,unix...)

  • 所有那些我想得到答案的小问题都可以总结为一个整体的问题: 是否有一个防弹的、整体的、始终有效的、防故障的、最佳实践的、über_function将在所有和任何条件下工作??

编辑 I -另一个文件扩展名列表

4

1 回答 1

3

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

这是最好的方法。它由操作系统提供,并且是您能做的最好的。我知道没有任何情况下它不起作用。

一个例外是包含.. 但是没有一个理智的人会引入这样的文件扩展名,因为它会破坏任何地方,而且它会破坏隐式约定。

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

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

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

于 2012-10-29T00:54:04.037 回答