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

How do I get (extract) a file extension in PHP?

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

1
2
3
4
5
6
7
8
$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()

1
$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

请享用


pathinfo()

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

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


示例URL:http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

对于网址,请勿使用pathinfo

1
2
3
4
5
$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:

1
2
3
4
5
6
$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示例,请参阅:使用PHP获取完整URL


还有SplFileInfo

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

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

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


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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 - 获取文件扩展名

示例代码

1
2
3
4
5
6
7
8
9
<?php

$info = new SplFileInfo('test.png');
var_dump($info->getExtension());

$info = new SplFileInfo('test.tar.gz');
var_dump($info->getExtension());

?>

这将输出

1
2
string(3)"png"
string(2)"gz"

2)如果你使用(PHP 4> = 4.0.3,PHP 5)获得扩展的另一种方法是pathinfo

示例代码

1
2
3
4
5
6
7
8
9
<?php

$ext = pathinfo('test.png', PATHINFO_EXTENSION);
var_dump($ext);

$ext = pathinfo('test.tar.gz', PATHINFO_EXTENSION);
var_dump($ext);

?>

这将输出

1
2
string(3)"png"
string(2)"gz"

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


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

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

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


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

1
2
3
4
$path = '/path/to/file.tar.gz';

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

另请注意,pathinfo无法处理某些非ASCII字符(通常只是从输出中抑制它们)。在通常不是问题的扩展中,但是要注意那个警告并没有什么坏处。


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

1
2
$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // The output should be the extension of the file e.g., png, gif, or html


您也可以尝试这个(它适用于PHP 5. *和7):

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

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


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


快速修复将是这样的。

1
2
3
4
5
6
7
8
9
10
11
// Exploding the file based on the . 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];


pathinfo是一个数组。我们可以查看目录名称,文件名,扩展名等:

1
2
3
4
5
6
7
8
9
10
$path_parts = pathinfo('test.png');

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

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

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

所以$ ext将是".txt"。


我发现pathinfo()SplFileInfo解决方案适用于本地文件系统上的标准文件,但如果您使用远程文件可能会遇到困难,因为有效图像的URL可能有#(片段) URL结尾处的标识符和/或?(查询参数),这些解决方案将(不正确)视为文件扩展名的一部分。

我发现这是一种在URL上使用pathinfo()的可靠方法,首先解析它以在文件扩展名之后去除不必要的混乱:

1
2
3
$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()

这会奏效

1
$ext = pathinfo($filename, PATHINFO_EXTENSION);


你也可以尝试这个:

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

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

@Kurt Zhong已经回答了。

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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);
?>


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

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

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

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

  • 实际上,我一直在寻找。

    1
    2
    3
    4
    5
    6
    7
    <?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);

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

    1
    2
    3
    4
    5
    $ext     = explode('.', $filename); // Explode the string
    $ext_len = count($ext) - 1; // Count the array -1 (because count() starts from 1)
    $my_ext  = $ext[$ext_len]; // Get the last entry of the array

    echo $my_ext;

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

    this is the best way if you have filenames like name.name.name.ext (ugly, but it sometimes happens


    对不起......"简短的问题;但不是简短的回答"

    PATH的示例1

    1
    2
    3
    4
    $path ="/home/ali/public_html/wp-content/themes/chicken/css/base.min.css";
    $name = pathinfo($path, PATHINFO_FILENAME);
    $ext  = pathinfo($path, PATHINFO_EXTENSION);
    printf(' Name: %s  Extension: %s', $name, $ext);

    URL的示例2

    1
    2
    3
    4
    5
    $url ="//www.example.com/dir/file.bak.php?Something+is+wrong=hello";
    $url = parse_url($url);
    $name = pathinfo($url['path'], PATHINFO_FILENAME);
    $ext  = pathinfo($url['path'], PATHINFO_EXTENSION);
    printf(' Name: %s  Extension: %s', $name, $ext);

    示例1的输出:

    1
    2
    Name: base.min
    Extension: css

    示例2的输出:

    1
    2
    Name: file.bak
    Extension: php

    参考

  • https://www.php.net/manual/en/function.pathinfo.php

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

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


  • 使用

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

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