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

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

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

等等

然而,总是有“最好的方法”,它应该在stackoverflow上。

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

事实上,它确实存在,但很less有人知道。 符合pathinfo()

 $ext = pathinfo($filename, PATHINFO_EXTENSION); 

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

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

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

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

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

请享用

PATHINFO()

一个例子…

 $path_info = pathinfo('/foo/bar/baz.bill'); echo $path_info['extension']; // "bill" 

忘记PATHINFO ,更安全的是: PARSE_URL


例如,url是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' 

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部分url(即#smth )在PHP请求中不可用,但只能用于javascript。

还有SplFileInfo

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

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

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

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

或者,也可以不使用文件扩展名,而使用fileinfo( http://us2.php.net/fileinfo )来确定文件的MIMEtypes。

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

 // 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 – 获取文件扩展名

示例代码

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

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

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

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

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

在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 

只要它不包含path,你也可以使用:

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

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

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

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

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

所以$ ext将是“.txt”

快速解决将是这样的。

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

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

这将工作

 $ext = pathinfo($filename, PATHINFO_EXTENSION); 

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

我发现这是一个可靠的方法来使用pathinfo()后的第一个parsing它去除文件扩展名后的不必要的混乱:

 $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() 

你也可以试试这个:

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

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

我们来看看比较结果: https : //eval.in/661574

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

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

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

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

你也可以试试这个
(在PHP 5 *和7上工作)

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

提示:如果文件没有扩展名,它将返回一个空string
好好享受 ;)

使用

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

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