如何在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];

但是,总有“最好的方法”,它应该在Stack Overflow上。

747605 次浏览

pathinfo()

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

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

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

享受

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

或者,您可以使用文件信息来确定文件的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 fileswitch ($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;}

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

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

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

还有SplFileInfo

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

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

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

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

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

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

使用

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

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

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

1)如果您使用(PHP 5>=5.3.6)您可以使用SplFileInfo::getEx委-获取文件扩展名

示例代码

<?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),获取扩展的另一种方法是路径信息

示例代码

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

//编辑:删除一个括号

这会管用的

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

所以$extx将是“. txt”。

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

$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

快速修复应该是这样的。

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

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

A)不要使用建议的不安全#0

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示例

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

<?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 typeif($extension=='html'){// Do operation}endfor;print_r($ext);?>

你也可以试试这个:

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

路径信息是一个数组。我们可以检查目录名、文件名、扩展名,等等:

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

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

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

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

@库尔特·钟已经回答了。

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

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

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

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

虽然“最佳方式”值得商榷,但我相信这是最佳方式,原因如下:

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

事实上,我在找那个。

<?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这样的文件名(丑陋,但有时会发生):

$ext     = explode('.', $filename); // Explode the string$my_ext  = end($ext); // Get the last entry of the array
echo $my_ext;
ltrim(strstr($file_url, '.'), '.')

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

“简短的问题,但不是简短的答案。

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.minExtension: css

示例2的输出:

Name: file.bakExtension: 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

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

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

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

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

动作快点!

换句话说,如果您只使用文件名,请停止使用路径信息。

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

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

这些纳秒值在每个系统上显然会有所不同,但它们可以清楚地显示比例。SplFileInfopathinfo是很棒的家伙,但对于这种工作来说,唤醒他们根本不值得。出于同样的原因,explode()比regex快得多。非常简单的工具往往会击败更复杂的工具。

结论

这似乎是武士之道:

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

请记住,这仅适用于简单的文件名。如果您涉及路径,请坚持路径信息或单独处理迪尔名称。

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

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

谢了

在一行:

pathinfo(parse_url($url,PHP_URL_PATH),PATHINFO_EXTENSION);

“最佳”方式取决于上下文以及您对该文件扩展名所做的事情。但是

🥇路径信息通常是最好的,当你考虑所有的角度。

pathinfo($file, PATHINFO_EXTENSION)

它不是最快的,但它足够快。它易于阅读,易于记忆和在任何地方重复使用。任何人都可以一目了然地理解它,如果他们需要有关该文件的更多信息,可以删除PATHINFO_EXT标志。

strrpos方法。在几个答案中描述的更快是的,但需要额外的安全检查,这反过来又需要您将其包装在函数中,以使其易于重用。然后,您必须从一个项目到另一个项目随身携带该函数或查找它。将其包装在带有额外检查的函数调用中也会使其变慢,如果您需要有关文件的任何其他信息,您现在可以调用其他方法,此时,您将失去速度优势,同时具有更难阅读的解决方案。速度的潜力是存在的,但不值得,除非你需要解决这样的瓶颈。

❌我也会排除任何使用substr爆炸和大多数其他手动操作的想法,原因与上述相同。

共享文件信息非常酷,但占用了更多的大脑空间😝有很多接口,你无疑会浪费时间学习,只是下次再查找它们。我只会在特定情况下使用它,当他们回来添加/编辑你的代码时,你会发现额外的接口值得学习Spl。

❌我根本不会考虑preg_replace,因为PHP中的任何正则表达式函数平均比任何其他函数慢3倍,更难阅读,并且在大多数情况下可以用更简单的东西轻松完成。正则表达式功能强大,在那些特定情况下它可以在一行中替换多个方法调用和条件检查。以这种方式获得文件扩展名就像用铁砧钉钉子一样。


当然,“最好的”取决于公众舆论,但我认为其他方法只是在特殊情况下“最好的”。

例如,如果您只想检查特定类型,那么我不会使用任何建议的方法,因为条纹将是使用最快的不区分大小写的比较。

if (stripos('/here/is/sOme.fiLe.PdF', '.pdf', -4) !== false ){//its a pdf file}

但同样,Pathinfo仍然更易于阅读,并且可能值得性能成本。

但是https://ome. com.///lica.ted?URLS呢?

从URL中提取路径是一个单独的问题,超出了问题的范围,并且在任何简单的一次性字符串比较都不起作用的情况下都需要额外的步骤。