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

$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.

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


当前回答

尽管“最佳方式”值得商榷,但我认为这是最佳方式,原因如下:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}

它可以与扩展的多个部分一起工作,例如tar.gz简短高效的代码它可以使用文件名和完整路径

其他回答

1) 如果您正在使用(PHP 5>=5.3.6)可以使用SplFileInfo::getExtension-获取文件扩展名

示例代码

<?php

$info = new SplFileInfo('test.png');
var_dump($info->getExtension());

$info = new SplFileInfo('test.tar.gz');
var_dump($info->getExtension());

?>

这将输出

string(3) "png"
string(2) "gz"

2) 如果您正在使用(PHP4>=4.0.3,PHP5),另一种获取扩展名的方法是pathinfo

示例代码

<?php

$ext = pathinfo('test.png', PATHINFO_EXTENSION);
var_dump($ext);

$ext = pathinfo('test.tar.gz', PATHINFO_EXTENSION);
var_dump($ext);

?>

这将输出

string(3) "png"
string(2) "gz"

//EDIT:删除支架

快速修复可能是这样的。

// Exploding the file based on the . operator
$file_ext = explode('.', $filename);

// Count taken (if more than one . exist; files like abc.fff.2013.pdf
$file_ext_count = count($file_ext);

// Minus 1 to make the offset correct
$cnt = $file_ext_count - 1;

// The variable will have a value pdf as per the sample file name mentioned above.
$file_extension = $file_ext[$cnt];

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

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

享受

只要它不包含路径,您也可以使用:

array_pop(explode('.', $fname))

其中$fname是文件的名称,例如:my_picture.jpg。结果将是:jpg

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

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