816

这是一个您可以在网络上随处阅读的问题,并提供各种答案:

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

4

29 回答 29

1889

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

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

享受

于 2008-10-06T11:03:24.493 回答
184

pathinfo()

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

echo $path_info['extension']; // "bill"
于 2008-10-06T11:02:33.590 回答
117

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

A)不要使用建议的 unsafePATHINFO

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

B)使用PARSE_URL

parse_url($url)['scheme']    'http'
parse_url($url)['host']      'example.com'
parse_url($url)['path']      '/myfolder/sympony.mp3'
parse_url($url)['query']     'aa=1&bb=2'
parse_url($url)['fragment']  'XYZ'

奖励:查看所有原生 PHP 示例

于 2015-07-17T12:39:31.847 回答
66

还有SplFileInfo

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

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

$ext  = (new SplFileInfo($path))->getExtension();
于 2012-10-17T10:32:32.363 回答
37

做的更快!

换句话说,如果您只使用文件名,请停止使用 pathinfo。

我的意思是,如果你有一个完整的 pathname, pathinfo 是有意义的,因为它比仅仅查找点更聪明:路径可以包含点,而文件名本身可能没有。所以在这种情况下,考虑像 , pathinfo 这样的输入字符串d:/some.thing/myfile和其他配备齐全的方法是一个不错的选择。

但是如果你只有一个没有路径的文件名,那么让系统工作得比它需要的更多是毫无意义的。这可以为您提供 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

Those nanosecond values will obviously differ on each system, but they give a clear picture about proportions. SplFileInfo and pathinfo are great fellas, but for this kind of job it's simply not worth it to wake them up. For the same reason, explode() is considerably faster than regex. Very simple tools tend to beat more sophisticated ones.

Conclusion

This seems to be the Way of the Samurai:

function fileExtension($name) {
    $n = strrpos($name, '.');
    return ($n === false) ? '' : substr($name, $n+1);
}

Remember this is for simple filenames only. If you have paths involved, stick to pathinfo or deal with the dirname separately.

于 2020-04-07T11:34:49.777 回答
24

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;
}
于 2008-10-06T14:23:33.620 回答
22

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

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

文件名在哪里$fname,例如:my_picture.jpg. 结果将是:jpg

于 2012-08-11T12:42:33.573 回答
13

1)如果您使用的是(PHP 5 >= 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 >= 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"

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

于 2014-08-02T07:52:06.087 回答
12

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

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

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

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

于 2012-11-01T18:11:18.010 回答
9

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

$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
于 2015-05-13T06:44:32.500 回答
9

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

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

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

于 2017-02-12T05:40:13.617 回答
9

抱歉...“简短的问题;但不是简短的答案”

PATH 示例 1

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

URL 示例 2

$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('<hr> Name: %s <br> Extension: %s', $name, $ext);

示例 1 的输出:

Name: base.min
Extension: css

示例 2 的输出:

Name: file.bak
Extension: php

参考

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

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

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

于 2019-07-20T15:51:57.537 回答
6

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

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

所以 $ext 将是“.txt”。

于 2015-02-25T23:22:17.000 回答
6

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";
于 2016-06-03T04:43:04.233 回答
5
substr($path, strrpos($path, '.') + 1);
于 2013-12-05T11:13:42.490 回答
5

快速修复将是这样的。

// 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];
于 2015-05-26T09:29:54.553 回答
4

你也可以试试这个:

 pathinfo(basename($_FILES["fileToUpload"]["name"]), PATHINFO_EXTENSION)
于 2016-05-24T09:53:55.377 回答
3

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

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

$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()
于 2015-01-20T20:40:36.697 回答
3

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

@Kurt Zhong 已经回答了。

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

于 2016-10-17T05:09:51.103 回答
3
ltrim(strstr($file_url, '.'), '.')

如果您有像 name.name.name.ext 这样的文件名,这是最好的方法(丑陋,但有时会发生

于 2019-07-16T22:24:51.273 回答
2

这将起作用

$ext = pathinfo($filename, PATHINFO_EXTENSION);
于 2015-01-15T10:12:23.017 回答
2

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

<?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);
?>
于 2016-05-04T05:35:14.460 回答
2

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;
于 2019-04-05T16:19:03.577 回答
2

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

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

另一种方式,我们也可以使用 strrpos 来查找最后一次出现 '.' 的位置。在文件名中并将该位置增加 1,以便它将从 (.)

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

于 2019-09-14T16:50:48.760 回答
1

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

ltrim(strrchr($PATH, '.'),'.');
于 2016-09-09T13:54:18.230 回答
1

尽管“最佳方式”值得商榷,但我相信这是最好的方式,原因如下:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. 它适用于扩展的多个部分,例如tar.gz
  2. 简短高效的代码
  3. 它适用于文件名和完整路径
于 2018-08-05T15:33:57.667 回答
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);
于 2019-03-28T14:18:24.253 回答
0

I tried one simple solution it might help to someone else to get just filename from the URL which having get parameters

<?php

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

?>

Thanks

于 2021-01-07T13:14:08.690 回答
-1

采用

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

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

于 2012-11-28T12:05:26.560 回答