如何在PHP中获取(提取)文件扩展名? PATHINFO PARSE_URL获取PHP中的完整URL

问题描述 投票:669回答:24

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

$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 file-extension
24个回答
1697
投票

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

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

请享用


5
投票
substr($path, strrpos($path, '.') + 1);

5
投票

快速修复将是这样的。

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

4
投票

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

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

所以$ ext将是“.txt”。


4
投票

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

4
投票

您也可以尝试这个(它适用于PHP 5. *和7):

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

提示:如果文件没有扩展名,则返回空字符串


3
投票

这会奏效

$ext = pathinfo($filename, PATHINFO_EXTENSION);

3
投票

我发现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()

2
投票

你也可以尝试这个:

 pathinfo(basename($_FILES["fileToUpload"]["name"]), PATHINFO_EXTENSION)

2
投票

使用substr($path, strrpos($path,'.')+1);。这是所有比较中最快的方法。

@Kurt Zhong已经回答了。

我们来看看比较结果:https://eval.in/661574


1
投票

如果您正在寻找速度(例如在路由器中),您可能不希望对所有内容进行标记。许多其他答案将失败与/root/my.folder/my.css

ltrim(strrchr($PATH, '.'),'.');

152
投票

pathinfo()

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

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

1
投票

虽然“最佳方式”值得商榷,但我认为这是最好的方法,原因如下:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. 它适用于扩展的多个部分,例如tar.gz
  2. 简短而有效的代码
  3. 它适用于文件名和完整路径

1
投票

您可以获取特定文件夹中的所有文件扩展名,并使用特定文件扩展名执行操作:

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

0
投票

实际上,我一直在寻找。

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

0
投票

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;

0
投票

ltrim(strstr($file_url, '.'), '.')

如果你有像name.name.name.ext这样的文件名,这是最好的方法(丑陋,但有时会发生


0
投票

“简短问题;简答”

对于路径:

$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"
} 

参考文献:

https://www.php.net/manual/en/function.realpath.php

https://www.php.net/manual/en/function.parse-url.php


-1
投票

使用

str_replace('.', '', strrchr($file_name, '.'))

用于快速扩展检索(如果您确定您的文件名有一个)。


88
投票

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

For URLs, don't use 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'

Use PARSE_URL instead:

$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'

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


For all native PHP examples, see: Get the full URL in PHP


53
投票

还有SplFileInfo

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

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

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

20
投票

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

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

?>

这将输出

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"

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


11
投票

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

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

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


9
投票

有时不使用pathinfo($path, PATHINFO_EXTENSION)是有用的。例如:

$path = '/path/to/file.tar.gz';

echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz

另请注意,pathinfo无法处理某些非ASCII字符(通常它只是从输出中抑制它们)。在通常不是问题的扩展中,但是要注意那个警告并没有什么坏处。


7
投票

在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
© www.soinside.com 2019 - 2024. All rights reserved.