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

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

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


当前回答

这会奏效的

$ext = pathinfo($filename, PATHINFO_EXTENSION);

其他回答

快一点!

换句话说,如果您只使用文件名,请停止使用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或单独处理目录名。

IMO,如果你有像name.name.name.ext这样的文件名(很难看,但有时会发生这种情况),这是最好的方法:

$ext     = explode('.', $filename); // Explode the string
$my_ext  = end($ext); // Get the last entry of the array

echo $my_ext;

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

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

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

您可以获取特定文件夹中的所有文件扩展名,并使用特定文件扩展名执行操作:

<?php
    $files = glob("abc/*.*"); // abc is the folder all files inside folder
    //print_r($files);
    //echo count($files);
    for($i=0; $i<count($files); $i++):
         $extension = pathinfo($files[$i], PATHINFO_EXTENSION);
         $ext[] = $extension;
         // Do operation for particular extension type
         if($extension=='html'){
             // Do operation
         }
    endfor;
    print_r($ext);
?>

Use

str_replace('.', '', strrchr($file_name, '.'))

以便快速检索扩展名(如果您确定文件名有扩展名)。