代码之家  ›  专栏  ›  技术社区  ›  Bite code

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

  •  651
  • Bite code  · 技术社区  · 17 年前

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

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

    等。

    然而,总是有“最好的方法”,它应该在堆栈溢出时出现。

    22 回复  |  直到 7 年前
        1
  •  1640
  •   Sayed Mohd Ali    7 年前

    来自其他脚本语言的人总是认为他们的脚本更好,因为他们有一个内置的函数来完成这个任务,而不是使用PHP(我现在看到的是pythonistas:-)。

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

    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    

    这是快速和内置的。 PaTyf() 根据传递给它的常量,可以提供其他信息,例如规范路径。

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

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

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

    最后,请注意,这只适用于文件路径,而不是使用parse-url覆盖的url资源路径。

    享受

        2
  •  148
  •   T.Todua Laurent W.    7 年前

    pathinfo()

    $path_info = pathinfo('/foo/bar/baz.bill');
    
    echo $path_info['extension']; // "bill"
    
        3
  •  80
  •   T.Todua Laurent W.    7 年前

    示例URL: 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示例,请参见: Get the full URL in PHP

        4
  •  51
  •   hakre    13 年前

    也有 SplFileInfo :

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

    通常,如果您传递这样一个对象而不是字符串,那么您可以编写更好的代码,这样您的代码就更容易说话了。由于php 5.4,这是一个一行程序:

    $ext  = (new SplFileInfo($path))->getExtension();
    
        5
  •  20
  •   TazGPL    9 年前

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

    或者,您可以使用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;
    }
    
        6
  •  12
  •   nils    11 年前

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

    这将输出

    字符串(3)“PNG”
    字符串(2)“GZ”
    

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

        7
  •  10
  •   Anonymous    13 年前

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

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

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

        8
  •  9
  •   Alix Axel    13 年前

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

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

    还要注意 pathinfo 无法处理一些非ASCII字符(通常它只是从输出中抑制它们),在扩展中,这通常不是问题,但注意到这一警告并不有害。

        9
  •  7
  •   Shahbaz XML    10 年前

    在PHP中获取文件扩展名的最简单方法是使用PHP内置函数 pathinfo .

    $file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
    echo ($file_ext); // the out should be extension of file eg:-png, gif, html
    
        10
  •  5
  •   Kurt Zhong    12 年前
    substr($path, strrpos($path, '.') + 1);
    
        11
  •  5
  •   version 2    10 年前

    快速修复就是这样。

        //exploding the file based on . 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];
    
        12
  •  4
  •   G. I. Joe    11 年前

    下面是一个例子,假设$filename是“example.txt”

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

    所以$ext将是“.txt”

        13
  •  4
  •   Arshid KV    9 年前

    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";  
    
        14
  •  4
  •   pooya_sabramooz    9 年前

    你也可以试试这个
    (使用php 5.*和7)

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

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

        15
  •  3
  •   Deepika Patel    11 年前

    这会起作用

    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    
        16
  •  3
  •   Jonathan Ellis    11 年前

    我发现 pathinfo() SplFileInfo 对于本地文件系统上的标准文件,解决方案效果很好,但如果使用远程文件,则可能会遇到困难,因为有效图像的URL可能具有 # (片段标识符)和/或 ? (查询参数)在URL的末尾,这两个解决方案都将(不正确)视为文件扩展名的一部分。

    我发现这是一种可靠的使用方法 PaTyf() 在第一次对URL进行解析以除去文件扩展名后不必要的混乱之后:

    $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()
    
        17
  •  2
  •   smile 22121    9 年前

    您也可以尝试以下操作:

     pathinfo(basename( $_FILES["fileToUpload"]["name"]),PATHINFO_EXTENSION)
    
        18
  •  2
  •   Abbas    9 年前

    为什么不使用 substr($path, strrpos($path,'.')+1); ? 这是所有比较中最快的方法。 @库尔特钟已经回答了。

    让我们在这里检查比较结果: https://eval.in/661574

        19
  •  1
  •   Samir Karmacharya    9 年前

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

    <?php
        $files=glob("abc/*.*");//abc is 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 perticular extenstion type
            if($extension=='html'){
                //do operation
            }
        endfor;
        print_r($ext);
    ?>
    
        20
  •  1
  •   Ray Foss    9 年前

    如果你在寻找速度(比如在路由器中),你可能不想标记所有东西。许多其他答案都会失败 /root/my.folder/my.css

    ltrim(strrchr($PATH, '.'),'.');
    
        21
  •  1
  •   Dan Bray    7 年前

    尽管“最好的方法”是有争议的,但我认为这是最好的方法,原因有几个:

    function getExt($path)
    {
        $basename = basename($path);
        return substr($basename, strlen(explode('.', $basename)[0]) + 1);
    }
    
    1. 它可与多个部分一起工作,如 tar.gz
    2. 短而有效的代码
    3. 它同时使用文件名和完整路径
        22
  •  -1
  •   AlexB    13 年前

    使用

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

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

    推荐文章