这是一个您可以在网络上到处都可以找到的各种各样的答案的问题:

$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*\.([^.]+)$/D', '', $filename);

$exts = split("[/\.]", $filename);
$n    = count($exts)-1;
$ext  = $exts[$n];


等。

但是,总有“最好的方式”,并且应该在堆栈溢出上。

评论

问题和答案的来源:cowburn.info/2008/01/13/get-file-extension-comparison

获取ext的另一种方法是strrchr($ filename,'。');

strrpos是正确的方法(请参阅我的答案),但对于不扩展的情况,它需要增加一个内容。

#1 楼

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

事实上,它确实可以存在,但很少有人知道。满足pathinfo()

$ext = pathinfo($filename, PATHINFO_EXTENSION);


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

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

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


此外,请注意,这并未考虑文件内容或mime类型,仅获得扩展名。但这就是您要的。

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

享受

评论


我的pathinfo被禁用,然后提取扩展字符串的捷径?

–khizar ansari
2012年8月10日18:20

@khizaransari您应该寻找另一家托管服务提供商,这很愚蠢。真的,我是真的。没有任何理由禁用此功能。告诉他们。解决方法:函数get_ext($ fname){return substr($ fname,strrpos($ fname,“。”)+ 1); }但是,请确保文件具有扩展名,当您将路径作为参数传递时,它可能会执行任何操作!

–吕克
2012-09-20 17:29



我对此示例有问题-它不适用于“ ............. doc”之类的名称,为什么有任何想法?

–波尔
2013年12月19日8:33



我对PHP的了解比起python,我的想法已经完全改变了:O

– Tommaso Barbugli
2014年7月2日在10:22

这不是一个安全的解决方案。如果有人在不使用浏览器的情况下上传到您的端点,他们可能会欺骗该扩展名。例如:pathinfo('image.jpg.spoofed',PATHINFO_EXTENSION)返回'Spoofed'!它不检查实际文件主体,因为它不采用文件路径,并且不使用MimeType映射验证其结果。您应该通过查询iana.org/assignments/media-types/media-types.txt或检查您自己的MimeType映射,确保从此接收的值实际上是有效类型。

–约翰·弗利
2015年4月23日在1:11



#2 楼

pathinfo()

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

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


评论


从PHP 5.5开始-> echo pathinfo('/ foo / bar / baz.bill')['extension'];

–萨拉曼A
2014-09-13 12:18



这甚至可以在此级别上使用(Twitter json):$ ext = pathinfo($ result-> extended_entities-> media [0]-> video_info-> variants [1]-> url,PATHINFO_EXTENSION);

– KJS
16年4月4日在1:01

#3 楼

范例网址:http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ
A)不要使用建议的不安全PATHINFO
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示例

评论


这个答案涵盖了所有内容。像foo_folder / foo-file.jpg这样的文件吗?1345838509将仅通过pathinfo,thanx惨败

–user1299518
15年7月20日在6:46

并非完全是话题,但确实可以解决我的问题!

– Howie
15年11月24日在6:48

不要忘记什么! parse_url用于URL,而pathinfo用于文件路径。

– Nabi K.A.Z.
17年9月9日在6:02

您是什么意思“忘记路径信息”?您在解决方案中使用它!

–秋天伦纳德
17年6月20日在14:12

@AutumnLeonard他没有,他只是展示了pathinfo和parse_url之间的区别。

–user443346
17年8月29日在9:52

#4 楼

还有SplFileInfo

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


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

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


评论


太棒了,它的对象一直向下:)

–克里斯托弗·蔡斯(Christopher Chase)
2013年6月26日15:12

请注意,自PHP 5.3.6起,SplFileInfo中提供了-> getExtension()。

–matthias
2014年8月26日在12:02

@matthias:请注意,可以在PHP 5.3.0发行版之前的PHP版本中禁用SPL。如果您仍未运行PHP 5.3,但仍未运行5.2或更低版本,则此答案很可能不适合稳定的代码。否则,您可以通过要求特定的PHP版本来稳定代码,否则请采取紧急措施。

– hakre
14年8月26日在12:24

@hakre正确地说“可以在5.3.0之前的版本中禁用”,但默认情况下,PHP 5.0.0起默认编译了SPL扩展名。因此,对于被迫使用PHP 5.2或更低版本且不想使用特定SPL类退出的人们来说,此注释确实有意义。

–matthias
2014年8月26日12:35

是的,只是死版本绒毛:)

– hakre
14年8月26日在13:02

#5 楼

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


评论


这是唯一正确的答案。我不明白为什么人们会投票赞成别人。是的,这种方法需要开发人员付出更多的努力,但可以提高性能(虽然很少,但是确实可以)。请参考这个。

– Bhavik Shah
2014年1月31日7:43



@Bhavik:在某些情况下,我们可能只需要文件扩展名,它们涉及mime类型检查。但是实际的问题是关于文件扩展名,而不是文件类型。因此,这不是此问题的最佳答案。 (尚未回答)

– Sasi varna kumar
2015年10月23日在8:25

#6 楼

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

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


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

评论


@为什么有3个投票?它给出适当的结果。请解释

–railsbox
2014年5月22日下午6:23

没错,这不是最佳方法。争取获得一些平衡。

–user622327
14年7月15日在1:52

这是最好的方法,当您需要真实的扩展名且文件名中可能包含多个。时,例如用户上传的照片。

–劳利·拉甘德(Rauli Rajande)
2014年7月21日在15:35

如果文件名没有扩展名,则失败。尝试传递“ myfile”,它将返回“ myfile”。在此用例中,正确的返回值是一个空字符串作为扩展名。

– pmont
2014年12月5日17:25

这是错误的,因为array_pop()将指针作为参数,这会引发通知。

–urchks
15年7月31日在12:50

#7 楼

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"


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

#8 楼

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

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

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


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

评论


@ e-satis:根据Wikipedia的介绍,它们是两个扩展:类UNIX的文件系统使用不同的模型,而没有分离的扩展元数据。点字符只是主文件名中的另一个字符,文件名可以具有多个扩展名,通常表示嵌套的转换,例如files.tar.gz。

– Alix Axel
2012年11月1日23:29

如果我们在产品名称中加点号?例如:test.19-02-2014.jpeg

–马里奥(Mario Radomanana)
2014年3月26日14:05

这将失败,因为/root/my.folder/my.css ltrim(strrchr($ PATH,'。'),'。')的工作原理与pathinfo相同,但没有标记所有内容。

–雷·福斯(Ray Foss)
2016年9月9日下午13:46

#9 楼

您也可以尝试一下(在PHP 5. *和7上有效):

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


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

#10 楼

在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


#11 楼

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

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


参考文献


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


#12 楼

更快地做。
低级通话需要非常快,所以我认为值得进行一些研究。我尝试了几种方法(具有不同的字符串长度,扩展名长度,每个都多次运行),这是一些合理的方法:
 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

注意:第一种方法具有副作用:没有扩展名时,它将返回全名。为避免这种行为,再加上额外的弹力来测量它肯定没有任何意义。
结论
这似乎是武士的出路:
 function fileExtension($s) {
    $n = strrpos($s,".");
    return ($n===false) ? "" : substr($s,$n+1);
}
 


#13 楼

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

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


所以$ ext将是“ .txt”。

#14 楼

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 楼

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


评论


这将因/root/my.folder/my.css而失败

–雷·福斯(Ray Foss)
16年9月9日在13:44

这必须正常工作:substr($ path,strrpos($ path,'。')+ 1);注意:此方法比以上任何其他解决方案都快。使用我们自己的脚本尝试基准测试。

–阿巴斯
16-10-17在5:04

#16 楼

快速修复将是这样。

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


评论


为什么不仅仅出于php.net/manual/en/function.pathinfo.php的目的使用内置函数php而不是使用长代码

– Shahbaz
15年7月1日在5:40

除了Shahbaz的观点,您还可以执行$ file_ext = end(explode('。',$ filename));。在一行中而不是在四行中完成此答案中的所有操作。

– tvanc
16年1月7日在2:49

@Amelia如果您有.tar.gz,该怎么办。它不起作用,因此如果您需要充分使用扩展名,例如ltrim(strstr($ filename,'。'),'。');充满扩展而不是不正确地作为gz。

– Marin Sagovac
16年5月21日在20:00

#17 楼

您也可以尝试以下操作:

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


#18 楼

我发现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()


#19 楼

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

@Kurt Zhong已回答。

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

评论


不。它不是最快的,如果您使用不带扩展名的文件名来调用它,将会给您带来一些惊喜。

– dkellner
8月6日23:42

#20 楼

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



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


#21 楼

这将起作用

$ext = pathinfo($filename, PATHINFO_EXTENSION);


评论


Subodh早在8月就已经回答了这个问题。

– NisseEngström
15年1月15日在12:18

早在2008年就已经提出了这一建议。如果您有独特和有价值的东西可以提供,请发表答案。多余的内容只会浪费研究人员的时间,并使Stack Overflow页面显得肿。

– mickmackusa
6月28日4:03



#22 楼

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

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


#23 楼

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

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

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

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

#24 楼

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

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


#25 楼

尽管“最佳方法”值得商bat,但出于某些原因,我认为这是最佳方法:

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



它与扩展的多个部分一起使用,例如tar.gz

短而有效的代码
它既可以使用文件名又可以使用完整路径


#26 楼

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;


#27 楼

实际上,我正在寻找。

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


#28 楼

使用

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


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