e-s*_*tis 697 php file-extension
这是一个你可以在网上到处阅读的问题,有各种答案:
$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];
Run Code Online (Sandbox Code Playgroud)
等等
但是,总有"最好的方法",它应该在Stack Overflow上.
e-s*_*tis 1724
来自其他脚本语言的人总是认为他们更好,因为他们有内置的功能而不是PHP(我现在正在看Pythonistas :-)).
事实上,它确实存在,但很少有人知道它.见面pathinfo()
:
$ext = pathinfo($filename, PATHINFO_EXTENSION);
Run Code Online (Sandbox Code Playgroud)
这是快速和内置的.pathinfo()
可以为您提供其他信息,例如规范路径,具体取决于您传递给它的常量.
请记住,如果您希望能够处理非ASCII字符,则需要先设置区域设置.例如:
setlocale(LC_ALL,'en_US.UTF-8');
Run Code Online (Sandbox Code Playgroud)
另外,请注意,这不考虑文件内容或mime类型,您只能获得扩展名.但这就是你要求的.
最后,请注意,这仅适用于文件路径,而不适用于使用PARSE_URL覆盖的URL资源路径.
请享用
Ada*_*ght 163
$path_info = pathinfo('/foo/bar/baz.bill');
echo $path_info['extension']; // "bill"
Run Code Online (Sandbox Code Playgroud)
T.T*_*dua 94
示例网址: 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'
Run Code Online (Sandbox Code Playgroud)
$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'
Run Code Online (Sandbox Code Playgroud)
注意:只有在手动添加时,服务器端才能使用主题标签.
hak*_*kre 57
还有SplFileInfo
:
$file = new SplFileInfo($path);
$ext = $file->getExtension();
Run Code Online (Sandbox Code Playgroud)
通常,如果你传递这样一个对象而不是字符串,你可以编写更好的代码,那么你的代码就更多了.从PHP 5.4开始,这是一个单行:
$ext = (new SplFileInfo($path))->getExtension();
Run Code Online (Sandbox Code Playgroud)
dke*_*ner 22
换句话说,请停止为这项工作使用 pathinfo。它比较慢。这种低级调用需要非常快,所以我认为值得进行一些研究。我尝试了几种方法(具有各种字符串长度、扩展长度、每种方法多次运行),这里有一些合理的方法。我不得不更新以前的统计数据,因为 php 版本(以及内核和许多其他东西)发生了变化,但在 Linux 服务器上,外卖总是相同的。
/* 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();}
Run Code Online (Sandbox Code Playgroud)
测试字符串是“something.that.contains.dots.txt”;如您所见,测量结果被划分回纳秒级。SplFileInfo
并且pathinfo
是很棒的家伙,但是对于这种工作来说,唤醒他们根本不值得。出于同样的原因,explode()
比正则表达式快得多。非常简单的工具几乎总能打败更复杂的工具。
旁注:在 Windows 上,结果完全不同。如果您使用的是 IIS,我想为您自己的案例运行这些数字是值得的。
这似乎是武士之道:
function fileExtension($s) {
$n = strrpos($s,".");
return ($n===false) ? "" : substr($s,$n+1);
}
Run Code Online (Sandbox Code Playgroud)
File name fileExtension()
----------------------------------------
file ""
file. ""
file.txt "txt"
file.txt.bin "bin"
file.txt.whatever "whatever"
.htaccess "htaccess"
Run Code Online (Sandbox Code Playgroud)
(最后一个有点特殊;它可能只是一个扩展名,也可能是一个纯名称为“.htaccess”的空扩展名,我不确定是否有相关规则。所以我想你可以同时使用两者,只要你知道自己在做什么。)
Tox*_*ene 21
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;
}
Run Code Online (Sandbox Code Playgroud)
Ano*_*ous 13
只要它不包含路径,您也可以使用:
array_pop(explode('.', $fname))
Run Code Online (Sandbox Code Playgroud)
$fname
例如,文件的名称在哪里:my_picture.jpg
结果将是:jpg
Sub*_*axe 12
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());
?>
Run Code Online (Sandbox Code Playgroud)
这将输出
string(3) "png"
string(2) "gz"
Run Code Online (Sandbox Code Playgroud)
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);
?>
Run Code Online (Sandbox Code Playgroud)
这将输出
string(3) "png"
string(2) "gz"
Run Code Online (Sandbox Code Playgroud)
//编辑:删除了一个括号
Ali*_*xel 10
有时不使用它是有用的pathinfo($path, PATHINFO_EXTENSION)
,例如:
$path = '/path/to/file.tar.gz';
echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz
Run Code Online (Sandbox Code Playgroud)
还要注意,pathinfo
无法处理一些非ASCII字符(通常它只是从输出中抑制它们),在通常不是问题的扩展中,但是要注意那个警告并没有什么坏处.
Bra*_*rad 10
“最佳”方法取决于上下文以及您对该文件扩展名执行的操作。\n但是,
\n当您考虑所有角度时,路径信息通常是最好的。
\npathinfo($file, PATHINFO_EXTENSION)\n
Run Code Online (Sandbox Code Playgroud)\n它不是最快的,但也足够快了。它易于阅读、易于记忆并可随处重复使用。任何人都可以一目了然地理解它,如果需要有关该文件的更多信息,可以删除 PATHINFO_EXT 标志。
\n\xe2\x9d\x8c strrpos方法。几个答案中描述的速度更快,是的,但需要额外的安全检查,这反过来又要求您将其包装在一个函数中,以使其易于重用。\n然后您必须将该函数从一个项目带到另一个项目或查找它。 \n将其包装在带有额外检查的函数调用中也会使其变慢,如果您需要有关文件的任何其他信息,您现在可以调用其他方法,此时,您无论如何都会失去速度优势,同时拥有一个解决方案难以阅读。\n速度的潜力是存在的,但不值得,除非您需要解决这样的瓶颈。
\n\xe2\x9d\x8c出于与上述相同的原因,我还会排除任何使用substr、explode和大多数其他手动操作的想法。
\n\xe2\x9d\x8c SplFileInfo非常酷,但由于有很多接口占用了更多的大脑空间,你无疑会浪费时间学习,只是为了下次再查找它们。我只会在特定情况下使用它,当人们稍后回来添加/编辑您的代码时,您会发现值得学习 Spl 的额外接口。
\n\xe2\x9d\x8c 我根本不会考虑preg_replace,因为 PHP 中的任何正则表达式函数平均比任何其他函数慢 3 倍,更难以阅读,并且在大多数情况下可以轻松地用更简单的东西来完成。正则表达式功能强大,在特定情况下占有一席之地,它可以在一行中替换多个方法调用和条件检查。\n以这种方式获取文件扩展名就像使用铁砧钉钉子一样。
\n当然,“最好”取决于公众舆论,但我认为其他方法只有在特殊情况下才是“最好”。
\n例如,如果您只想检查特定类型,那么我不会使用任何建议的方法,因为stripos将是最快的不区分大小写的比较。
\nif (stripos(\'/here/is/sOme.fiLe.PdF\', \'.pdf\', -4) !== false )\n{\n //its a pdf file\n}\n
Run Code Online (Sandbox Code Playgroud)\n但同样,pathinfo 仍然更容易阅读,并且可能值得性能成本。
\n但是 https://ome.Com.///lica.ted?URLS 呢?
\n从 URL 中提取路径是一个单独的问题,超出了问题的范围,并且在简单的一次性字符串比较无法完成的任何情况下都需要额外的步骤。
\nPATH 示例 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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
示例 1 的输出:
Name: base.min
Extension: css
Run Code Online (Sandbox Code Playgroud)
示例 2 的输出:
Name: file.bak
Extension: php
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
小智 7
您也可以尝试这样做(它在PHP 5. *和7上有效):
$info = new SplFileInfo('test.zip');
echo $info->getExtension(); // ----- Output -----> zip
Run Code Online (Sandbox Code Playgroud)
提示:如果文件没有扩展名,它将返回一个空字符串
这是一个例子。假设$ filename是“ example.txt”,
$ext = substr($filename, strrpos($filename, '.', -1), strlen($filename));
Run Code Online (Sandbox Code Playgroud)
因此$ ext将是“ .txt”。
快速修复将是这样的.
// 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];
Run Code Online (Sandbox Code Playgroud)
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";
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)