如何在PHP中获取(提取)文件扩展名?

时间:2008-10-06 11:00:03

标签: php file-extension

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

$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上。

29 个答案:

答案 0 :(得分:1680)

其他脚本语言的人总是认为他们更好,因为他们有内置的功能而不是PHP(我现在正在看Pythonistas: - ))。

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

另外,请注意,这不考虑文件内容或mime-type,只能获得扩展名。但这就是你要求的。

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

享受

答案 1 :(得分:149)

pathinfo()

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

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

答案 2 :(得分:84)

示例网址: 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#XYZ'         // <------- BAD !!
$x['extension']  'mp3?a=1&b=2#XYZ'                 // <------- BAD !!
$x['filename']   'sympony'

使用更安全的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'] 'XYZ'             

注意:只有手动添加主题标签才能在服务器端使用。

对于所有本机PHP示例,请参阅:Get the full URL in PHP

答案 3 :(得分:52)

还有SplFileInfo

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

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

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

答案 4 :(得分:20)

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

或者,您可以使用fileinfo(http://us2.php.net/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;
}

答案 5 :(得分:12)

1)如果您使用(PHP 5&gt; = 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)如果您使用(PHP 4&gt; = 4.0.3,PHP 5),另一种获取扩展程序的方式是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"

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

答案 6 :(得分:10)

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

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

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

答案 7 :(得分:9)

有时不使用pathinfo($path, PATHINFO_EXTENSION)非常有用,例如:

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

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

另请注意pathinfo无法处理某些非ASCII字符(通常它只是从输出中抑制它们),在通常不是问题的扩展中,但是没有意识到这一点警告。

答案 8 :(得分:7)

做得更快。

低级别通话必须非常快,因此我认为值得进行一些研究。我尝试了几种方法(具有不同的字符串长度,扩展名长度,每个都有多次运行),这是一些合理的方法:

split = Lambda(lambda whole: tf.split(whole, num_or_size_splits=hyper['max_len'], axis=1))(x)

结果 并不奇怪。 function method1($s) {return preg_replace("/.*\./","",$s);} // edge case problem function method2($s) {preg_match("/\.([^\.]+)$/",$s,$a);return $a[1];} function method3($s) {$n = strrpos($s,"."); if($n===false) return "";return substr($s,$n+1);} function method4($s) {$a = explode(".",$s);$n = count($a); if($n==1) return "";return $a[$n-1];} function method5($s) {return pathinfo($s, PATHINFO_EXTENSION);} 较差(到目前为止!)最慢;即使使用pathinfo选项,似乎他仍在尝试解析整个内容,然后删除所有不必要的部分。另一方面,内置的PATHINFO_EXTENSION功能几乎完全是针对这项工作而发明的,不会绕道而行,因此,它的性能也比其他申请人要好得多。

strrpos

注意:第一个方法有一个副作用:没有扩展名时,它将返回整个名称。为避免这种行为,再加上额外的应力来测量它肯定没有任何意义。

结论

这似乎是武士之道:

Original filename was: something.that.contains.dots.txt
Running 50 passes with 10000 iterations each
Minimum of measured times per pass:

    Method 1:   312.6 mike  (response: txt) // preg_replace
    Method 2:   472.9 mike  (response: txt) // preg_match
    Method 3:   167.8 mike  (response: txt) // strrpos
    Method 4:   340.3 mike  (response: txt) // explode
    Method 5:  2311.1 mike  (response: txt) // pathinfo  <--------- poor fella

答案 9 :(得分:7)

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

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

答案 10 :(得分:5)

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

答案 11 :(得分:5)

快速修复就是这样的。

    //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 :(得分:4)

这是一个例子,假设$ filename是&#34; example.txt&#34;

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

所以$ ext将是&#34; .txt&#34;

答案 13 :(得分:4)

你也可以试试这个 (适用于PHP 5. *和7)

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

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

答案 14 :(得分:4)

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

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

答案 15 :(得分:3)

这将有效

$ext = pathinfo($filename, PATHINFO_EXTENSION);

答案 16 :(得分:3)

我发现pathinfo()SplFileInfo解决方案适用于本地文件系统上的标准文件,但如果您使用远程文件作为有效图像的URL可能会遇到困难在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()

答案 17 :(得分:2)

你也可以试试这个:

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

答案 18 :(得分:2)

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

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

答案 19 :(得分:1)

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

而失败
ltrim(strrchr($PATH, '.'),'.');

答案 20 :(得分:1)

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

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

答案 21 :(得分:1)

尽管“最佳方法”值得商,,但出于以下几个原因,我认为这是最佳方法:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. 它与扩展的多个部分一起使用,例如tar.gz
  2. 简短高效的代码
  3. 它同时适用于文件名和完整路径

答案 22 :(得分:0)

实际上,我在找那个。

<?php

$url = 'http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ';
$tmp = @parse_url($url)['path'];
$ext = pathinfo($tmp, PATHINFO_EXTENSION);

var_dump($ext);

答案 23 :(得分:0)

IMO这是最好的方法,如果您具有像name.name.name.ext这样的文件名(难看但有时会发生)

$ext     = explode( '.', $filename ); //explode the string
$ext_len = count( $ext ) - 1; //count the array -1 (becouse count() starts from 1)
$my_ext  = $ext[ $ext_len ]; //get the last entry of the array

echo $my_ext;

答案 24 :(得分:0)

ltrim(strstr($file_url, '.'), '.')

  

如果您使用的文件名是name.name.name.ext(这很丑,但有时会发生

答案 25 :(得分:0)

“简短问题;简短答案”

对于路径:

$path =  "/home/ali/public_html/wp-content/themes/chicken/css/base.css";
echo basename($path);

输出:

base.css

对于URL:

$url = '//www.example.com/file.php?Something is wrong=hello';

var_dump(parse_url($url));

输出:

array(3) {
["host"]=> string(15) "www.example.com"
["path"]=> string(9) "/file.php"
["query"]=> string(24) "Something is wrong=hello"
} 

参考:

https://www.php.net/manual/en/function.realpath.php

https://www.php.net/manual/en/function.parse-url.php

答案 26 :(得分:0)

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

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

另一种方法,我们也可以使用strrpos在文件名中查找最后一次出现“。”的位置,并将该位置增加1,以便其从(。)处爆炸字符串。

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

答案 27 :(得分:0)

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

<?php

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

?>

谢谢

答案 28 :(得分:-1)

使用

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

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