PHP中获取文件扩展名:2025年的5种方法(来自Stack Overflow的问题)

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

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

开始课程

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

\n\n

您是否曾遇到过需要快速判断用户上传的是图片、文档还是压缩包的情况?或者,您正在编写一个文件解析器,需要动态处理数百种扩展名?问题 "How can I get a file's extension in PHP?" 多年来一直是Stack Overflow上最热门的问题之一,获得了数十万次浏览。这并非偶然。

\n\n

看起来很简单,不是吗?获取字符串,找到点号,截取后面的部分。但PHP是一种有个性的语言。它直接提供了多个内置函数,而选择正确的函数取决于具体场景。在2025年,当安全性和性能比以往任何时候都更重要时,我们将分析所有当前可用的方法,并找出最佳方案。

\n\n

在本文中,您将了解到:

\n
    \n
  • 五种在PHP中获取文件扩展名的可行方法。
  • \n
  • 在95%的情况下应该使用哪种方法。
  • \n
  • 如何避免处理无扩展名文件或包含多个点号的文件时陷入陷阱。
  • \n
  • 可直接复制的真实代码示例。
  • \n
\n\n

方法1:经典方法——pathinfo()

\n\n

如果您问任何有经验的PHP开发者如何获取文件扩展名,他们会毫不犹豫地回答:pathinfo()。这是最流行且推荐的方法。该函数返回一个包含路径信息的数组:目录、文件名、扩展名和完整名称。

\n\n
<?php\n$file = 'document.pdf';\n$extension = pathinfo($file, PATHINFO_EXTENSION);\necho $extension; // 输出: pdf\n?>\n
\n\n

这种方法的优点在于其简单性和可读性。您传入文件名和常量 PATHINFO_EXTENSION,就能得到不含多余字符的纯净结果。pathinfo() 能正确处理大多数标准情况,包括包含多个点号的文件,例如 archive.tar.gz —— 在这种情况下,它会返回 gz,这是合理的,因为它是最终的扩展名。

\n\n

优点: 直观易懂,内置函数,能处理任何复杂路径。

\n

缺点: 如果文件没有扩展名,可能返回空字符串。

\n\n

方法2:字符串操作——strrchr() + substr()

\n\n

有时在遗留代码或教学示例中,您会看到手动解析。思路很简单:找到字符串中最后一个点号,并取它之后的所有内容。

\n\n
<?php\n$file = 'image.jpg';\n$extension = substr(strrchr($file, '.'), 1);\necho $extension; // 输出: jpg\n?>\n
\n\n

strrchr() 函数找到字符的最后一次出现,并返回从该字符开始(包括该字符)的所有内容。substr() 使用参数 1 来去掉点号。这种方法运行可靠,但代码可读性较差。

\n\n

有趣的事实: 这种方法是C风格函数时代的直接继承者。在微基准测试中,它比 pathinfo() 更快,但在实际项目中差异可以忽略不计。如果您正在编写高负载的解析器,并且每一微秒都很重要,可以使用它。

\n\n

方法3:快速但粗糙的方法——explode()

\n\n

这是新手最容易想到的最简单方法:按点号分割字符串,并取数组的最后一个元素。

\n\n
<?php\n$file = 'report.xlsx';\n$parts = explode('.', $file);\n$extension = end($parts);\necho $extension; // 输出: xlsx\n?>\n
\n\n

注意:这是一种 不良实践。为什么?想象一个文件 my.file.name.txt。explode() 会将其分成4部分,end() 会返回 txt。看起来是对的。但是,如果文件名为 .htaccess 呢?数组将是 ['', 'htaccess'],扩展名将返回为 htaccess,尽管这实际上是完整的文件名。或者,如果文件没有扩展名,则会返回文件名本身。

\n\n

这种方法应该

博客

书籍推荐