当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在PHP中获取(提取)文件扩展名?》经验,为你挑选了14个好方法。

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

$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上.



1> e-satis..:

来自其他脚本语言的人总是认为他们更好,因为他们有内置的功能而不是PHP(我现在正在看Pythonistas :-)).

事实上,它确实存在,但很少有人知道它.见面pathinfo():

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

另外,请注意,这不考虑文件内容或mime类型,您只能获得扩展名.但这就是你要求的.

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

请享用


我希望我能两次投票.我无法告诉你我使用pathinfo替换了多少代码
@khizaransari你应该寻找另一个托管服务提供商,你得到的是愚蠢的.真的,我的意思是.没有理由__禁用此功能.告诉他们.解决方法:`function get_ext($ fname){return substr($ fname,strrpos($ fname,".")+ 1); 确保文件有一个扩展名,当你传递路径作为参数时,它可以做任何事情!
我对PHP的想法与python相比完全改变了,因为我知道这个函数:O
我也这样.这就是我把它放在这里的原因!
Whaddaya知道,事实证明有一个最好的方法.
这不是一个安全的解决方案.如果有人在不使用浏览器的情况下上传到您的终端,他们可以欺骗扩展程序.例如:pathinfo('image.jpg.spoofed',PATHINFO_EXTENSION)返回'欺骗'!! 它不检查实际文件正文,因为它不采用文件路径,并且它不会使用MimeType Map验证其结果.您应该通过查询http://www.iana.org/assignments/media-types/media-types.txt或检查您自己的MimeType Map来确保您从中获得的值实际上是有效类型.
我投票给你写它的方式......:程序员生活中的一点点快乐值得100个好事.
请记住,它并不是真正的unicode安全.

2> Adam Wright..:

pathinfo()

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

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


从PHP 5.5开始 - >`echo pathinfo('/ foo/bar/baz.bill')['extension'];`
这是"最好的方式"

3> T.Todua..:

示例网址: 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#XYZ'         // <------- BAD !!
$x['extension']  'mp3?a=1&b=2#XYZ'                 // <------- 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'] 'XYZ'

注意:只有在手动添加时,服务器端才能使用主题标签.


有关所有本机PHP示例,请参阅:使用PHP 获取完整URL


不要忘了什么!`parse_url`用于URL,`pathinfo`用于文件路径.
这个答案涵盖了所有内容.像`foo_folder/foo-file.jpg?1345838509`这样的文件只会因`pathinfo`而失败.

4> hakre..:

还有SplFileInfo:

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

通常,如果你传递这样一个对象而不是字符串,你可以编写更好的代码,那么你的代码就更多了.从PHP 5.4开始,这是一个单行:

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


@salathe:是的,好的代码:)谢谢你做的一切.
请注意,自PHP 5.3.6起,SplFileInfo中提供了` - > getExtension()`.

5> Toxygene..:

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

或者,您可以使用fileinfo(http://us2.php.net/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:在某些情况下,我们可能只需要文件扩展名,关于mime类型检查.但实际问题是关于文件扩展名,而不是文件类型.所以这不是这个问题的最佳答案.(还是答案)

6> Anonymous..:

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

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

$fname例如,文件的名称在哪里:my_picture.jpg 结果将是:jpg


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

7> Subodh Ghula..:

1)如果你正在使用(PHP 5> = 5.3.6) 你可以使用SplFileInfo :: getExtension - 获取文件扩展名

示例代码

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

示例代码


这将输出

string(3) "png"
string(2) "gz"

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



8> Alix Axel..:

有时不使用它是有用的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-satisf:根据[Wikipedia](http://en.wikipedia.org/wiki/Filename_extension),它们是两个扩展:*类UNIX文件系统使用不同的模型而没有隔离的扩展元数据.点字符只是主文件名中的另一个字符,文件名可以有多个扩展名,通常表示嵌套转换,例如files.tar.gz*.

9> Shahbaz..:

在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



10> 小智..:

您也可以尝试这样做(它在PHP 5. *和7上有效):

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

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



11> Kurt Zhong..:
substr($path, strrpos($path, '.') + 1);



12> G. I. Joe..:

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

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

因此$ ext将是“ .txt”。



13> version 2..:

快速修复将是这样的.

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



14> Arshid KV..:

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

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有