这是一个你可以在网上到处阅读的问题,有各种答案:
$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上。
来自其他脚本语言的人总是认为他们更好,因为他们有内置的功能而不是PHP(我现在正在看Pythonistas :-))。
事实上,它确实存在,但很少有人知道它。认识pathinfo()
:
$ext = pathinfo($filename, PATHINFO_EXTENSION);
这是快速和内置的。 pathinfo()
可以为您提供其他信息,例如规范路径,具体取决于您传递给它的常量。
请记住,如果您希望能够处理非ASCII字符,则需要先设置区域设置。例如:
setlocale(LC_ALL,'en_US.UTF-8');
另外,请注意,这不考虑文件内容或mime类型,您只能获得扩展名。但这就是你要求的。
最后,请注意,这仅适用于文件路径,而不适用于使用PARSE_URL覆盖的URL资源路径。
请享用
substr($path, strrpos($path, '.') + 1);
快速修复将是这样的。
// 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];
这是一个例子。假设$ filename是“example.txt”,
$ext = substr($filename, strrpos($filename, '.', -1), strlen($filename));
所以$ ext将是“.txt”。
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";
您也可以尝试这个(它适用于PHP 5. *和7):
$info = new SplFileInfo('test.zip');
echo $info->getExtension(); // ----- Output -----> zip
提示:如果文件没有扩展名,则返回空字符串
这会奏效
$ext = pathinfo($filename, PATHINFO_EXTENSION);
我发现pathinfo()
和SplFileInfo
解决方案适用于本地文件系统上的标准文件,但如果您使用远程文件可能会遇到困难,因为有效图像的URL可能有#
(片段标识符)和/或?
URL末尾的(查询参数),这些解决方案将(不正确)视为文件扩展名的一部分。
我发现这是一个可靠的方法在URL上使用pathinfo()
后首先解析它以消除文件扩展后不必要的混乱:
$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 Zhong已经回答了。
我们来看看比较结果:https://eval.in/661574
如果您正在寻找速度(例如在路由器中),您可能不希望对所有内容进行标记。许多其他答案将失败与/root/my.folder/my.css
ltrim(strrchr($PATH, '.'),'.');
$path_info = pathinfo('/foo/bar/baz.bill');
echo $path_info['extension']; // "bill"
虽然“最佳方式”值得商榷,但我认为这是最好的方法,原因如下:
function getExt($path)
{
$basename = basename($path);
return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
tar.gz
您可以获取特定文件夹中的所有文件扩展名,并使用特定文件扩展名执行操作:
<?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);
?>
实际上,我一直在寻找。
<?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这样的文件名,这是最好的方法(很丑,但有时会发生):
$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, '.'), '.')
如果你有像name.name.name.ext这样的文件名,这是最好的方法(丑陋,但有时会发生
“简短问题;简答”
对于路径:
$path = "/home/ali/public_html/wp-content/themes/chicken/css/base.css";
echo basename($path);
输出:
base.css
对于网址:
$url = '//www.example.com/file.php?Something is wrong=hello';
var_dump(parse_url($url));
输出:
array(3) {
["host"]=> string(15) "www.example.com"
["path"]=> string(9) "/file.php"
["query"]=> string(24) "Something is wrong=hello"
}
参考文献:
使用
str_replace('.', '', strrchr($file_name, '.'))
用于快速扩展检索(如果您确定您的文件名有一个)。
示例网址: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'
$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'
注意:只有在手动添加时,服务器端才能使用主题标签。
还有SplFileInfo
:
$file = new SplFileInfo($path);
$ext = $file->getExtension();
如果您传递这样的对象而不是字符串,通常可以编写更好的代码。那么你的代码就更多了。从PHP 5.4开始,这是一个单行:
$ext = (new SplFileInfo($path))->getExtension();
E-satisf的响应是确定文件扩展名的正确方法。
或者,您可以使用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;
}
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"
//编辑:删除了一个括号
只要它不包含路径,您也可以使用:
array_pop(explode('.', $fname))
其中$fname
是文件的名称,例如:my_picture.jpg
。结果将是:jpg
有时不使用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 output should be the extension of the file e.g., png, gif, or html