如何在 PHP 中获取文件的扩展名?

新手上路,请多包涵

这是一个您可以在网络上随处阅读的问题,并提供各种答案:

 $ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);

$exts = split("[/\\.]", $filename);
$n    = count($exts)-1;
$ext  = $exts[$n];

等等

然而,总有“最好的方法”,它应该在 Stack Overflow。

原文由 e-satis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 354
2 个回答

来自其他脚本语言的人总是认为他们的更好,因为他们有一个内置函数可以做到这一点,而不是 PHP(我现在正在看 Pythonistas :-))。

事实上,它确实存在,但很少有人知道。遇见 pathinfo()

 $ext = pathinfo($filename, PATHINFO_EXTENSION);

这是快速且内置的。 pathinfo() 可以为您提供其他信息,例如规范路径,具体取决于您传递给它的常量。

请记住,如果您希望能够处理非 ASCII 字符,则需要先设置语言环境。例如:

 setlocale(LC_ALL,'en_US.UTF-8');

另外,请注意,这不考虑文件内容或 mime 类型,您只会获得扩展名。但这是你要求的。

最后,请注意这仅适用于文件路径,而不适用于使用 PARSE_URL 涵盖的 URL 资源路径。

享受

原文由 e-satis 发布,翻译遵循 CC BY-SA 4.0 许可协议

“最佳”方式取决于上下文以及您对该文件扩展名所做的事情。 然而,

🥇 考虑所有角度时,通常路径信息是最好的。

 pathinfo($file, PATHINFO_EXTENSION)

它不是最快的,但它足够快。它易于阅读、易于记忆和随处重复使用。如果他们需要有关文件的更多信息,任何人都可以一目了然并删除 PATHINFO_EXT 标志。

strrpos 方法。在几个答案中描述的速度更快,是的,但需要额外的安全检查,这反过来又要求您将其包装在一个函数中,以使其易于重用。然后你必须从一个项目到另一个项目或查找它。将其包装在带有额外检查的函数调用中也会使其变慢,如果您需要有关文件的任何其他信息,您现在可以调用其他方法,此时,无论如何您都会失去速度优势,同时拥有更难阅读的解决方案。速度的潜力是存在的,但不值得,除非您需要解决这样的瓶颈。

❌ 出于上述相同的原因,我也会排除使用 substrexplode 和大多数其他手动操作的任何想法。

SplFileInfo 非常酷,但占用了更多的大脑空间😝 有很多界面,您无疑会浪费时间学习只是为了下次再查找它们。我只会在特定情况下使用它,当他们稍后回来添加/编辑您的代码时,您会发现值得学习 Spl 的额外接口。

❌ 我根本不会考虑 preg_replace ,因为 PHP 中的任何正则表达式函数平均比任何其他函数慢 3 倍,更难阅读,并且在大多数情况下可以用更简单的东西轻松完成。正则表达式功能强大,它在那些可以在一行中替换多个方法调用和条件检查的特定情况下占有一席之地。以这种方式获取文件扩展名就像使用铁砧敲钉子一样。


虽然“最好”当然会归结为公众舆论,但我认为其他方法仅在特殊情况下才是“最好的”。

例如,如果您只想检查特定类型,那么我不会使用任何建议的方法,因为 stripos 将是最快的不区分大小写的比较。

 if (stripos('/here/is/sOme.fiLe.PdF', '.pdf', -4) !== false )
{
    //its a pdf file
}

但同样 pathinfo 仍然会更好地阅读,并且可能值得付出性能成本。

但是 https://ome.Com.///lica.ted?URLS 呢?

从 URL 中提取路径是一个单独的问题,超出了问题的范围,并且在无法进行简单的一次性字符串比较的任何情况下都需要额外的步骤。

原文由 Brad 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题