这是一个你可以在网上到处阅读的问题,有各种答案:
等等
但是,总有"最好的方法",它应该在Stack Overflow上。
-
问答来源:cowburn.info/2008/01/13/get-file-extension-comparison
-
获得ext的另一种方法是strrchr($filename, '.');
来自其他脚本语言的人总是认为他们更好,因为他们有内置的功能而不是PHP(我现在正在看Pythonistas :-))。
事实上,它确实存在,但很少有人知道它。见pathinfo():
1
| $ext = pathinfo($filename, PATHINFO_EXTENSION ); |
这是快速和内置的。 pathinfo()可以为您提供其他信息,例如规范路径,具体取决于您传递给它的常量。
请记住,如果您希望能够处理非ASCII字符,则需要先设置区域设置。例如:
另外,请注意,这不考虑文件内容或mime类型,您只能获得扩展名。但这就是你要求的。
最后,请注意,这仅适用于文件路径,而不适用于使用PARSE_URL覆盖的URL资源路径。
请享用
-
我希望我能两次投票。我无法告诉你我使用pathinfo替换了多少代码
-
我也这样。这就是我把它放在这里的原因!
-
Whaddaya知道,事实证明有一个最好的方法。
-
我的pathinfo被禁用然后提取扩展字符串的简短方法?
-
@khizaransari你应该寻找另一个托管服务提供商,你得到的是愚蠢的。真的,我的意思是。没有理由禁用此功能。告诉他们。解决方法:function get_ext($fname){ return substr($fname, strrpos($fname,".") + 1); }确保文件有扩展名,当您将路径作为参数传递时,它可能会执行任何操作!
-
我对这个例子有一个问题 - 它不适用于像"............. doc"这样的名字,任何想法为什么?
-
我对PHP的想法与python相比完全改变了,因为我知道这个函数:O
-
我投票给你写它的方式......:D程序员生活中的一点快乐值得100个好事。
-
这太棒了! 7年前这是哪里?
-
我爱你。 #nohomo
-
@ e-satisf但它在我的应用程序中没有在一个场景中工作,就像有时我得到以下格式的URL,www.domain.com/image.php?id=123&idlocation=987&number=01来下载图像,因为这个uRL没有图像名称或扩展名,pathifo()是愿意为我们提供图片扩展。所以应该做什么!!!帮我
-
我没有像这里的其他人一样浪费,而是找到了这个答案并迅速解决了我的问题,这真的不公平。
-
这不是一个安全的解决方案。如果有人在不使用浏览器的情况下上传到您的终端,他们可以欺骗扩展程序。例如:pathinfo('image.jpg.spoofed',PATHINFO_EXTENSION)返回'欺骗'!!它不检查实际文件正文,因为它不采用文件路径,并且它不会使用MimeType Map验证其结果。您应该通过查询iana.org/assignments/media-types/media-types.txt或检查您自己的MimeType Map来确保您从中获得的值实际上是有效类型。
-
请记住,它并不是真正的unicode安全。
-
小心点!!!!!这不是安全的功能!阅读其他答案!
pathinfo()
1 2 3
| $path_info = pathinfo('/foo/bar/baz.bill');
echo $path_info['extension']; //"bill" |
-
这是"最好的方式"
-
从PHP 5.5开始 - > echo pathinfo('/foo/bar/baz.bill')['extension'];
-
这甚至适用于这个级别(Twitter json):$ ext = pathinfo($ result-> extended_entities-> media [0] - > video_info-> variants [1] - > url,PATHINFO_EXTENSION);
示例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
-
这个答案涵盖了所有内容。像foo_folder/foo-file.jpg?1345838509这样的文件只会以pathinfo,thanx失败
-
不完全是主题,但它确实解决了我的问题!
-
不要忘了什么! parse_url用于URL,pathinfo用于文件路径。
-
多么节俭!!!
-
你是什??么意思"忘记路径信息"?你在解决方案中使用它!
-
@AutumnLeonard他没有,他只是展示了pathinfo和parse_url之间的区别。
还有SplFileInfo:
1 2
| $file = new SplFileInfo($path);
$ext = $file->getExtension(); |
如果您传递这样的对象而不是字符串,通常可以编写更好的代码。那么你的代码就更多了。从PHP 5.4开始,这是一个单行:
1
| $ext = (new SplFileInfo($path))->getExtension(); |
-
很高兴看到我的代码被使用。 :)
-
@salathe:是的,好的代码:)谢谢你做了这一切。
-
神奇,它的物体一路下来:)
-
请注意,自PHP 5.3.6起,SplFileInfo中提供了->getExtension()。
-
@matthias:请注意,在PHP 5.3.0版本之前的PHP版本中可以禁用SPL。如果你仍然没有运行PHP 5.3但是5.2或更低版本,这个答案很可能不适合稳定的代码。否则,您可以通过要求特定的PHP版本来稳定您的代码,否则就会挽救。
-
@hakre虽然你说"可以在5.3.0之前的版本中禁用"是正确的,但是从PHP 5.0.0开始默认编译SPL扩展。所以这个评论对于被迫使用PHP 5.2或更低版本并且不想使用特定SPL类辞职的人来说确实有意义。
-
是的,只是死版绒毛:)
-
$ext = pathinfo($file, PATHINFO_EXTENSION)或$ext = pathinfo($file)['extension']是更好的单行。
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;
} |
-
这是唯一正确的答案。我不明白为什么人们投票给别人。是的,这种方法需要开发人员做出更多努力,但它会提升性能(尽管很少,但确实如此)。请参考这个。
-
@Bhavik:在某些情况下,我们可能只需要文件扩展名,关于mime类型检查。但实际问题是关于文件扩展名,而不是文件类型。所以这不是这个问题的最佳答案。 (还是答案)
-
这个开关需要一个额外的括号
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
| string(3)"png"
string(2)"gz" |
//编辑:删除了一个括号
只要它不包含路径,您也可以使用:
其中$fname是文件的名称,例如:my_picture.jpg。
结果将是:jpg
-
@为什么这有3个downvotes?它给出了适当的结果。请解释
-
这没有错,这不是最好的方法。为了一点平衡而投票赞成。
-
这是最好的方式,当你需要真正的扩展名和文件名可能有多个。的时候,就像用户上传的照片一样。
-
如果文件名没有扩展名,则会失败。尝试传入"myfile",它将返回"myfile"。正确的返回值是一个空字符串作为此用例中的扩展名。
-
这是错误的,因为array_pop()会抛出一个通知,因为它将指针作为其参数。
有时不使用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字符(通常只是从输出中抑制它们)。在通常不是问题的扩展中,但是要注意那个警告并没有什么坏处。
-
+1但它是一个灰色区域。 tar.gz是扩展名,还是.gz?
-
@ e-satisf:根据维基百科,它们是两个扩展:类UNIX文件系统使用不同的模型而没有隔离的扩展元数据。点字符只是主文件名中的另一个字符,文件名可以有多个扩展名,通常表示嵌套转换,例如files.tar.gz。
-
如果我们在产品名称中有点?例如:test.19-02-2014.jpeg
-
这将失败,因为/root/my.folder/my.css ltrim(strrchr($PATH, '.'),'.')的工作方式与pathinfo类似,但没有标记所有内容。
在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 |
提示:如果文件没有扩展名,则返回空字符串
-
使用/root/my.folder/my.css会失败
-
这必须正常工作: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]; |
-
为什么不只是使用php内置函数为php.net/manual/en/function.pathinfo.php而不是使用长代码
-
除了Shahbaz的观点,你也可以只用$file_ext = end(explode('.', $filename));来完成这个答案中的所有内容而不是四行。
-
@Amelia如果你有.tar.gz怎么办?它不起作用,所以如果你需要充满扩展使用,如ltrim(strstr($filename, '.'), '.');,而不是正确地扩展为gz。
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",
所以$ 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 ); |
你也可以尝试这个:
使用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
虽然"最佳方式"值得商榷,但我认为这是最好的方法,原因如下:
它适用于扩展的多个部分,例如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
使用
用于快速扩展检索(如果您确定您的文件名有一个)。