这是一个问题,你可以在网络上的任何地方看到各种答案:

$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];

etc.

然而,总是有“最好的方法”,它应该是堆栈溢出。


当前回答

使用substr($path、strrpos($path,“.”)+1);。这是所有比较中最快的方法。

@库尔特·钟已经回答了。

让我们在这里查看比较结果:https://eval.in/661574

其他回答

如果您正在寻找速度(例如在路由器中),您可能不想将所有内容都标记化。许多其他答案都会以/root/my.folder/my.css失败

ltrim(strrchr($PATH, '.'),'.');
ltrim(strstr($file_url, '.'), '.')

如果文件名像name.name.name.ext(丑陋,但有时会发生这种情况

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

事实上,它确实存在,但很少有人知道它

$ext = pathinfo($filename, PATHINFO_EXTENSION);

这是快速和内置的。pathinfo()可以根据传递给它的常量提供其他信息,例如规范路径。

请记住,如果您希望能够处理非ASCII字符,则需要首先设置区域设置。例如:

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

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

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

享受

您也可以尝试一下(它适用于PHP5.*和7):

$info = new SplFileInfo('test.zip');
echo $info->getExtension(); // ----- Output -----> zip

提示:如果文件没有扩展名,则返回空字符串

我发现pathinfo()和SplFileInfo解决方案对于本地文件系统上的标准文件很好,但如果您使用远程文件,可能会遇到困难,因为有效图像的URL可能有#(片段标识符)和/或?(查询参数),这两个解决方案都将(不正确)作为文件扩展名的一部分。

我发现这是一种在URL上使用pathinfo()的可靠方法,首先对其进行解析以去除文件扩展名后不必要的混乱:

$url_components = parse_url($url); // First parse the URL
$url_path = $url_components['path']; // Then get the path component
$ext = pathinfo($url_path, PATHINFO_EXTENSION); // Then use pathinfo()