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

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

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


当前回答

快一点!

换句话说,如果您只使用文件名,请停止使用pathinfo。

我的意思是,如果你有一个完整的路径名,pathinfo是有意义的,因为它比查找点更聪明:路径可以包含点,而文件名本身可能没有。因此,在本例中,考虑输入字符串如d:/some.thing/myfile、pathinfo和其他设备齐全的方法是一个不错的选择。

但是如果你只有一个文件名,没有路径,那么让系统工作得比需要的多是毫无意义的。这可以让你的速度提高10倍。

这里是一个快速速度测试:

/*   387 ns */ function method1($s) {return preg_replace("/.*\./","",$s);} // edge case problem
/*   769 ns */ function method2($s) {preg_match("/\.([^\.]+)$/",$s,$a);return $a[1];}
/*    67 ns */ function method3($s) {$n = strrpos($s,"."); if($n===false) return "";return substr($s,$n+1);}
/*   175 ns */ function method4($s) {$a = explode(".",$s);$n = count($a); if($n==1) return "";return $a[$n-1];}
/*   731 ns */ function method5($s) {return pathinfo($s, PATHINFO_EXTENSION);}
/*   732 ns */ function method6($s) {return (new SplFileInfo($s))->getExtension();}

//  All measured on Linux; it will be vastly different on Windows

这些纳秒值在每个系统上都会明显不同,但它们给出了一个关于比例的清晰画面。SplFileInfo和pathinfo是很棒的家伙,但对于这种工作来说,唤醒他们根本不值得。出于同样的原因,explode()比regex快得多。非常简单的工具往往胜过更复杂的工具。

结论

这似乎是武士的方式:

function fileExtension($name) {
    $n = strrpos($name, '.');
    return ($n === false) ? '' : substr($name, $n+1);
}

请记住,这仅适用于简单文件名。如果涉及到路径,请使用pathinfo或单独处理目录名。

其他回答

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

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

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

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

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

享受

$ext=preg_replace('/^.*\.([^.]+)$/D','$1',$fileName);

pregreplace方法我们使用正则表达式搜索和替换。在preg_replace函数中,第一个参数是搜索的模式,第二个参数$1是对第一个(.*)匹配的对象的引用,第三个参数是文件名。

另一种方法是,我们还可以使用strrpos来查找“”的最后一次出现的位置并将该位置递增1,使其从(.)开始分解字符串

$ext=substr($fileName,strrpos($fileName,'.')+1);

E-satis的响应是确定文件扩展名的正确方法。

或者,您可以使用fileinfo来确定文件的MIME类型,而不是依赖文件扩展名。

下面是处理用户上传的图像的简化示例:

// Code assumes necessary extensions are installed and a successful file upload has already occurred

// Create a FileInfo object
$finfo = new FileInfo(null, '/path/to/magic/file');

// Determine the MIME type of the uploaded file
switch ($finfo->file($_FILES['image']['tmp_name'], FILEINFO_MIME)) {        
    case 'image/jpg':
        $im = imagecreatefromjpeg($_FILES['image']['tmp_name']);
    break;

    case 'image/png':
        $im = imagecreatefrompng($_FILES['image']['tmp_name']);
    break;

    case 'image/gif':
        $im = imagecreatefromgif($_FILES['image']['tmp_name']);
    break;
}

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:删除支架