可能重复:
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 ......)
答案 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
的文件扩展名。
也就是说,检测文件扩展名无法帮助您确定文件是否实际上是它声称的类型。但我相信你知道这一点,只是把这个放在未来的读者身上。