提问



这是一个你可以在网上到处阅读的问题,有各种答案:


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


等等


但是,总有最好的方法,它应该在Stack Overflow上。

最佳参考


来自其他脚本语言的人总是认为他们更好,因为他们有内置的功能来做到这一点而不是PHP(我现在正在看pythonistas :-))。


事实上,它确实存在,但很少有人知道它。见pathinfo():[51]


$ext = pathinfo($filename, PATHINFO_EXTENSION);


这是快速和内置的。 pathinfo()可以为您提供其他信息,例如规范路径,具体取决于您传递给它的常量。


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


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


另请注意,这并未考虑文件内容或mimetype,您只能获得扩展名。但这就是您要求的内容。


最后,请注意,这仅适用于使用PARSE_URL覆盖的文件路径,而不适用于URL ressources路径。


请享用

其它参考1


pathinfo() [52]


$path_info = pathinfo('/foo/bar/baz.bill');

echo $path_info['extension']; // "bill"

其它参考2


使用更安全: PARSE_URL (而不是 PATHINFO )






例如,网址 http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ


PATHINFO返回:



$x = pathinfo($url);
$x['dirname']   🡺 'http://example.com/myfolder'
$x['basename']  🡺 'sympony.mp3?a=1&b=2'         // <------- BAD !!
$x['extension'] 🡺 'mp3?a=1&b=2'                 // <------- BAD !!
$x['filename']  🡺 'sympony'



[53]


PARSE_URL返回:



$x = parse_url($url);
$x['scheme']  🡺 'http'
$x['host']    🡺 'example.com'
$x['path']    🡺 '/myfolder/sympony.mp3'
$x['query']   🡺 'aa=1&bb=2'
$x['fragment']🡺 ''             //<----- this outputs hashtag "XYZ" only in case, when the link containing that hashtag was manually passed to function, because automatically, hashtags are not automatically detectable by PHP





dirname(parse_url($url)['path'])                      🡺 /myfolder
basename(parse_url($url))                             🡺 sympony.mp3
pathinfo(parse_url($url)['path'], PATHINFO_EXTENSION) 🡺 mp3


附:注意,网址的Hashtag部分(即#smth)在PHP请求中不可用,但只能使用javascript。[54]





有关有用的示例,请参阅:获取PHP中的完整URL


其它参考3


还有SplFileInfo: [56]


$file = new SplFileInfo($path);
$ext  = $file->getExtension();


通常,如果你传递这样一个对象而不是字符串,你可以编写更好的代码,那么你的代码就更多了。从PHP 5.4开始,这是一个单行:


$ext  = (new SplFileInfo($path))->getExtension();

其它参考4


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


或者,您可以使用fileinfo(http://us2.php.net/fileinfo)来确定文件MIME类型,而不是依赖文件扩展名。[57]


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


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

其它参考5


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


示例代码


<?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)如果您使用(PHP 4>=4.0.3,PHP 5),另一种获取扩展程序的方法是 pathinfo [59]


示例代码


<?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"


//编辑:删除了一个括号

其它参考6


有时不使用pathinfo($path, PATHINFO_EXTENSION)是有用的,例如:


$path = '/path/to/file.tar.gz';

echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz


还要注意pathinfo无法处理一些非ASCII字符(通常它只是从输出中抑制它们),在扩展中通常不是一个问题,但要注意这一点不会有什么害处。

其它参考7


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


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


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

其它参考8


在php中获取文件扩展名的最简单方法是使用php内置函数pathinfo。[60]


$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // the out should be extension of file eg:-png, gif, html

其它参考9


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

其它参考10


这是一个例子,假设$ filename是example.txt


$ext = substr($filename,strrpos($filename,'.',-1),strlen($filename));  


所以$ ext将是.txt

其它参考11


快速修复将是这样的。


    //exploding the file based on . 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];

其它参考12


pathinfo是数组。我们可以检查目录名称,文件名,扩展名[61]


$path_parts = pathinfo('test.png');

echo $path_parts['extension'], "\n";
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['filename'], "\n";  

其它参考13


你可以尝试这个

(适用于PHP 5. *和7)


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


提示:如果文件没有扩展名,则返回空字符串
点击
好好享受 ;)

其它参考14


这会奏效


$ext = pathinfo($filename, PATHINFO_EXTENSION);

其它参考15


我发现pathinfo()SplFileInfo解决方案适用于本地文件系统上的标准文件,但如果您正在使用远程文件,因为有效图像的URL可能有[[#(片段标识符)和/或?(查询参数)在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()

其它参考16


你也可以尝试这个:


 pathinfo(basename( $_FILES["fileToUpload"]["name"]),PATHINFO_EXTENSION)

其它参考17


为什么不使用substr($path, strrpos($path,'.')+1);?
这是所有比较中最快的方法。
@Kurt Zhong已经回答了。


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

其它参考18


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


<?php
    $files=glob("abc/*.*");//abc is 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 perticular extenstion type
        if($extension=='html'){
            //do operation
        }
    endfor;
    print_r($ext);
?>

其它参考19


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


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

其它参考20


虽然最佳方式值得商榷,但我认为这是最好的方法,原因如下:


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



  1. 它适用于扩展的多个部分,例如tar.gz

  2. 简短而有效的代码

  3. 它适用于文件名和完整路径


其它参考21


使用


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


用于快速扩展检索(如果您确定您的文件名有一个)。