如何在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, '.'))
为快速扩展检索(如果您确定您的文件名有一个)。