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

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

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


当前回答

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

<?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);
?>

其他回答

substr($path, strrpos($path, '.') + 1);

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

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

快一点!

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

我尝试了一个简单的解决方案,它可能会帮助其他人从具有get参数的URL中获取文件名

<?php

$path = "URL will be here";
echo basename(parse_url($path)['path']);

?>

谢谢

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;
}