如何在PHP中获取文件扩展名:2025年最佳实践

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何在PHP中获取文件扩展名:从新手到专家(2025年版)

\n\n

您有没有想过,PHP开发者一天要提取多少次文件扩展名?几十次,甚至上百次。头像上传、文档处理、图片验证——处处都需要弄清楚您遇到的是什么类型的文件:.jpg、.pdf,还是狡猾的.php.jpg。

\n\n

"How can I get a file's extension in PHP?" 这个问题是Stack Overflow上最热门的问题之一。这并非偶然。看起来很简单,对吧?但魔鬼往往藏在细节中。在2025年,我们不仅有久经考验的pathinfo()和explode(),还有PHP 8.4的新功能,它们让代码更简洁、更安全。

\n\n

让我们来剖析5种可行的方法,它们的优缺点以及何时使用。开始吧!

\n\n

1. 经典之作:pathinfo() —— 方法之王

\n\n

最流行且正确的方法是使用pathinfo()函数。它早在PHP 4中就出现了,至今仍然非常实用。为什么?因为它很智能:能识别系统路径分隔符,能处理URL,并且不会因为文件名中的点而出现问题。

\n\n
<?php\n$file = 'document.report.pdf';\n$extension = pathinfo($file, PATHINFO_EXTENSION);\n// 结果:'pdf'\n?>
\n\n

但有一个细节。如果文件没有扩展名,pathinfo()会返回一个空字符串。不是null,也不是false——而是一个空字符串。这对于严格的检查很重要。

\n\n
<?php\n$file = 'README';\n$ext = pathinfo($file, PATHINFO_EXTENSION);\nvar_dump($ext); // string(0) ""\n?>
\n\n

何时使用:任何时候需要快速可靠地获取扩展名。这是行业标准。

\n\n

2. 老派方法:explode() 和 strrpos()

\n\n

一些老派开发者喜欢手动解析字符串。思路很简单:找到最后一个点,然后取它之后的所有内容。

\n\n
<?php\n$file = 'image.jpg';\n$parts = explode('.', $file);\n$extension = end($parts);\n// 结果:'jpg'\n?>
\n\n

看起来可行。但有一个陷阱:explode()会创建一个数组,而end()会移动数组的内部指针。虽然不严重,但不够优雅。

\n\n

性能更好的版本是使用strrpos() + substr():

\n\n
<?php\n$file = 'archive.tar.gz';\n$pos = strrpos($file, '.');\n$extension = $pos !== false ? substr($file, $pos + 1) : '';\n// 结果:'gz'\n?>
\n\n

请注意:strrpos()查找的是点的最后一次出现。这是正确的——我们想要的是gz,而不是tar.gz。

\n\n

何时使用:当pathinfo()不可用时(罕见情况),或者需要对逻辑有更多控制时。

\n\n

3. 2025年新特性:str_contains() 和 str_starts_with()

\n\n

PHP 8.0引入了str_contains()和str_starts_with(),而PHP 8.4改进了对多字节字符串的处理。这开启了新的优雅方式。

\n\n
<?php\n$file = 'photo.2025.jpg';\n\nif (str_contains($file, '.')) {\n    $extension = substr($file, strrpos($file, '.') + 1);\n} else {\n    $extension = '';\n}\n// 结果:'jpg'\n?>
\n\n

漂亮吗?不太漂亮。但如果您需要检查文件是否为图片,str_ends_with()是您的好帮手:

\n\n
<?php\n$file = 'avatar.png';\n$isImage = str_ends_with($file, '.png') || str_ends_with($file, '.jpg');\n// true\n?>
\n\n

何时使用:用于快速检查特定扩展名,而无需提取整个扩展名。

\n\n

4. 正则表达式:当您需要一步到位时

\n\n

有时仅获取扩展名是不够的。例如,需要检查文件是否为安全的图片,同时提取不带扩展名的文件名。这时

博客

书籍推荐