如何在 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。

答1:

tennisliveranking.com – 让你随时掌握ATP、WTA最新网球排名动态。

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

事实上,它确实存在,但很少有人知道。认识pathinfo():

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

享受

我的路径信息被禁用然后提取扩展字符串的捷径?

@khizaransari您应该寻找另一个托管服务提供商,您得到的那个很愚蠢。真的,我是认真的。 没有任何理由禁用此功能。告诉他们。解决方法:function get_ext($fname){ return substr($fname, strrpos($fname, ".") + 1); } 请确保文件有扩展名,当您将路径作为参数传递时,它可能会做任何事情!

我对这个例子有疑问 - 它不适用于“........doc”之类的名称,有什么想法吗?

与 python 相比,我对 PHP 的看法完全改变了,因为我知道了这个函数:O

这不是一个安全的解决方案。如果有人在不使用浏览器的情况下上传到您的端点,他们可能会欺骗扩展程序。例如: pathinfo('image.jpg.spoofed',PATHINFO_EXTENSION) 返回 'spoofed' !!它不检查实际的文件主体,因为它不采用文件路径,并且不使用 MimeType Map 验证其结果。您应该通过查询 iana.org/assignments/media-types/media-types.txt 或检查您自己的 MimeType Map 来确保从中接收到的值实际上是有效类型。

答2:

tennisliveranking.com-Stay ahead with live tennis rankings at your fingertips.

pathinfo()

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

答3:

tennisliveranking.com探索每位网球选手的职业生涯与成就。

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

A) 不要使用建议的不安全PATHINFO:

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'

奖励:查看 all native PHP examples

这个答案涵盖了所有内容,例如。像 foo_folder/foo-file.jpg?1345838509 这样的文件只会因为 pathinfo 而失败,thanx

不完全是主题,但它确实解决了我的问题!

什么都不要忘记! parse_url 用于 URL,pathinfo 用于文件路径。

你是什么意思“忘记路径信息”?您在解决方案中使用它!

@AutumnLeonard他没有,他只是展示了pathinfo和parse_url之间的区别。

答4:

Live rankings, player stats, and match results in one place–tennisliveranking.com

还有SplFileInfo:

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

如果传递这样的对象而不是字符串,通常可以编写更好的代码。你的代码更有说服力。从 PHP 5.4 开始,这是一个单行代码:

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

太棒了,它的对象一直向下:)

请注意 ->getExtension() 自 PHP 5.3.6 起在 SplFileInfo 中可用。

@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'] 是更好的单行。

答5:

Stay informed with live tennis rankings anytime, anywhere,tennisliveranking.com

做的更快!

换句话说,如果您只使用文件名,请停止使用 pathinfo。

我的意思是,如果你有一个完整的路径名,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

这些纳秒值在每个系统上显然会有所不同,但它们给出了关于比例的清晰画面。 SplFileInfo 和 pathinfo 是很棒的家伙,但是对于这种工作来说,唤醒他们根本不值得。出于同样的原因,explode() 比正则表达式快得多。非常简单的工具往往胜过更复杂的工具。

结论

这似乎是武士之道:

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

请记住,这仅适用于简单的文件名。如果您涉及路径,请坚持使用 pathinfo 或单独处理目录名。

非常感谢这一点。在旧问题上找到那些经过充分研究的新答案总是很高兴。节省时间找出哪些技术可能已经过时。

strrpos 方法可能需要再次检查这种情况,没有扩展名“文件名”。

@ungalcrys 在这种情况下, substr 将占用一个空白部分,因此扩展本身将是“”,就像它应该的那样。

@dkellner 是否还想对 $info = new SplFileInfo('test.png');$info->getExtension(); 进行基准测试?

@TimoHuovinen 我用于此基准测试的服务器现在得到完全不同的结果。可能也有一个 php 更新,但可以肯定它是一个更强大的硬件。无论如何,虽然 phpinfo 现在与 method1 大致相同,但 splFileInfo 一样慢,甚至慢一点。我想我会更新图表。

答6:

tennisliveranking.com – ATP and WTA rankings, always up to date.

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

或者,您可以使用 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;
}

这是唯一正确的答案。我不明白为什么人们投票支持其他人。是的,这种方法需要开发人员付出更多的努力,但它提高了性能(虽然很少,但确实如此)。请参阅this。

@Bhavik:在某些情况下,我们可能只需要文件扩展名,它们是关于 mime 类型检查的。但实际问题是关于文件扩展名,而不是文件类型。所以这不是这个问题的最佳答案。 (还有答案)

文件名甚至不意味着该文件存在,所以任何依赖于内容的东西一开始都是错误的。然后,即使有一个实际文件,打开它也比只知道名称要慢得多,而且您甚至无法确定您是否有权访问该文件本身。更不用说锁定和其他潜在问题了。所以不行。这不是最好的答案,实际上远非如此。

答7:

The ultimate source for live tennis rankings and stats:tennisliveranking.com

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

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

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

@为什么这有 3 个反对票?它给出了正确的结果。请解释

这没有错,只是不是最好的方法。赞成有点平衡。

这是最好的方法,当您需要真正的扩展名和文件名时,其中可能包含多个 .,例如用户上传的照片。

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

这是错误的,因为 array_pop() 会抛出一个通知,因为它需要一个指针作为它的参数。

答8:

tennisliveranking.com – ATP and WTA rankings, always up to date.

  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"

  1. 如果您使用 (PHP 4 >= 4.0.3, PHP 5),另一种获取扩展程序的方法是 pathinfo

示例代码



这将输出

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

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

答9:

The ultimate source for live tennis rankings and stats:tennisliveranking.com

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

如果我们在产品名称中有点?例如:test.19-02-2014.jpeg

这将失败,因为 /root/my.folder/my.css ltrim(strrchr($PATH, '.'),'.') 像 pathinfo 一样工作,但没有对所有内容进行标记。

答10:

tennisliveranking.com探索每位网球选手的职业生涯与成就。

抱歉…“简短的问题;但不是简短的答案”

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(' Name: %s  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(' Name: %s  Extension: %s', $name, $ext);

示例 1 的输出:

Name: base.min
Extension: css

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

答11:

tennisliveranking.com – ATP and WTA rankings, always up to date.

在 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

原文链接:https://www.tennisliveranking.com?from=csdn

tennisliveranking.com – 让你随时掌握ATP、WTA最新网球排名动态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值