【问题标题】:How can I change a file's extension using PHP?如何使用 PHP 更改文件的扩展名?
【发布时间】:2008-10-11 07:11:54
【问题描述】:

如何使用 PHP 更改文件的扩展名?

例如:photo.jpg 到 photo.exe

【问题讨论】:

    标签: php file


    【解决方案1】:

    在现代操作系统中,文件名很可能在文件扩展名之前包含很长时间的句点,例如:

    my.file.name.jpg
    

    PHP 提供了一种无需扩展名即可查找文件名的方法,考虑到这一点,然后只需添加新扩展名:

    function replace_extension($filename, $new_extension) {
        $info = pathinfo($filename);
        return $info['filename'] . '.' . $new_extension;
    }
    

    【讨论】:

    • 对我来说,这是最好的答案,因为它使用 PHP 中的函数来实现其设计目的。它还在一个命令中完成计算,这意味着 PHP 内部的 C 代码更少。
    • 我认为这应该保留路径信息: return $info['dirname']."/".$info['filename'] 。 '。' . $new_extension;
    • 没有路径可能会破坏您的应用程序!
    【解决方案2】:
    substr_replace($file , 'png', strrpos($file , '.') +1)
    

    将任何扩展更改为您想要的。将 png 替换为您想要的扩展名。

    【讨论】:

    • 警告:如果找不到任何扩展名,它会弄乱你的文件名。
    【解决方案3】:

    替换扩展,保留路径信息

    function replace_extension($filename, $new_extension) {
        $info = pathinfo($filename);
        return ($info['dirname'] ? $info['dirname'] . DIRECTORY_SEPARATOR : '') 
            . $info['filename'] 
            . '.' 
            . $new_extension;
    }
    

    【讨论】:

    • 最佳答案!当心,DS 不适合这种情况
    • 哦,天哪……我已经习惯了 Magento 定义 DS = DIRECTORY_SEPARATOR 的地方。编辑了我的答案。谢谢。
    • 可能不安全,因为它不仅改变了扩展名。例如,在 Windows 上,可能会将一个分隔符更改为另一个。
    • @Enyby:你是什么意思?你有一个无效的示例名称吗?
    • 'c:\\windows\\system32/drivers/etc/some.file..png' - 更改为 'jpg' 给出下一个结果:'c:\\windows\\system32/drivers /etc\\some.file..jpg' - 文件名更改前的分隔符。在某些情况下,它可能会导致一些副作用。
    【解决方案4】:

    【讨论】:

    • 如果使用变量作为文件名怎么办?
    • 函数接受字符串,不管这些字符串是字符串文字还是字符串变量。
    • @me_ — 你为什么抱怨这不是对我的回答?差不多十年前,我刚刚评论
    • @me_ — 在询问有关特定任务的问题之前,OP 不了解编程语言的基本基础知识并不能做出假设知识不好的答案。如果是这样,那么每个答案都必须包含一个介绍性编程教程。
    • @me_ — 这与 OP 不知道诸如“字符串是字符串,无论它来自字符串文字还是变量”之类的基本原理无关。
    【解决方案5】:

    在字符串中包含文件名后,首先使用正则表达式将扩展名替换为您选择的扩展名。这是一个可以做到这一点的小函数:

    function replace_extension($filename, $new_extension) {
        return preg_replace('/\..+$/', '.' . $new_extension, $filename);
    }
    

    然后使用rename() 函数将文件重命名为新的文件名。

    【讨论】:

    • 其实这是个坏主意。在现代操作系统中,文件名可能在名称中包含句点,例如,将扩展名更改为“.tif”时,“this.is.a.test.pdf”在使用 this 时会将其剥离为“this.tif” , 使用: $info = pathinfo($filename);返回 $info['filename'] 。 “。” . $new_extension;
    • preg_replace('/\.[^.]+$/', '.' . $extension, $file) 匹配最后找到的.,但如果文件没有扩展名则不起作用
    【解决方案6】:

    只需用正则替换即可:

    $filename = preg_replace('"\.bmp$"', '.jpg', $filename);
    

    您还可以扩展此代码以删除其他图像扩展,而不仅仅是 bmp:

    $filename = preg_replace('"\.(bmp|gif)$"', '.jpg', $filename);
    

    【讨论】:

      【解决方案7】:

      对于正则表达式爱好者, Thanh Trung 的 'preg_replace' 解决方案的修改版本将始终包含新的扩展名(这样,如果您编写文件转换程序,就不会意外地用结果覆盖源文件)将是:

      preg_replace('/\.[^.]+$/', '.', $file) . $extension
      

      【讨论】:

      • 这是一个聪明的解决方案。通过使用正则表达式来简单地剥离扩展,然后使用字符串连接来应用新的扩展,它可以在比提供的任何其他解决方案更多的条件下工作。
      【解决方案8】:

      更好的方法:

      substr($filename, 0, -strlen(pathinfo($filename, PATHINFO_EXTENSION))).$new_extension
      

      仅对扩展部分进行了更改。保持其他信息不变。

      很安全。

      【讨论】:

      • 如果文件没有扩展名,它将替换完整的文件名。
      • @klodoma 是的。但是关于从一个扩展到另一个扩展的问题。所以它期待一些扩展存在。
      • 我明白了;至少在答案中说明这一点是值得的。
      【解决方案9】:

      你可以使用basename():

      $oldname = 'path/photo.jpg';
      $newname = (dirname($oldname) ? dirname($oldname) . DIRECTORY_SEPARATOR  : '') . basename($oldname, 'jpg') . 'exe';
      

      或者对于所有扩展:

      $newname = (dirname($oldname) ? dirname($oldname) . DIRECTORY_SEPARATOR  : '') . basename($oldname, pathinfo($path, PATHINFO_EXTENSION)) . 'exe';
      

      最后使用rename():

      rename($oldname, $newname);
      

      【讨论】:

        【解决方案10】:

        已经提出了许多好的答案。我认为评估和比较他们的表现会很有帮助。结果如下:

        • Tony Maro (pathinfo) 的回答耗时 0.000031040740966797 秒。注意:它的缺点是不包括完整路径。
        • Matt (substr_replace) 的回答耗时 0.000010013580322266 秒。
        • Jeremy Ruten (preg_replace) 的回答耗时 0.00070095062255859 秒。

        因此,我建议substr_replace,因为它比其他的更简单、更快。

        请注意,以下解决方案也需要 0.000014066696166992 秒。还是打不过substr_replace

        $parts = explode('.', $inpath);
        $parts[count( $parts ) - 1] = 'exe';
        $outpath = implode('.', $parts);
        

        【讨论】:

          【解决方案11】:

          我需要它来将所有带有图库的图像扩展名更改为小写。我最终做了以下事情:

          // Converts image file extensions to all lowercase
          $currentdir = opendir($gallerydir);
          while(false !== ($file = readdir($currentdir))) {
            if(strpos($file,'.JPG',1) || strpos($file,'.GIF',1) || strpos($file,'.PNG',1)) {
              $srcfile = "$gallerydir/$file";
              $filearray = explode(".",$file);
              $count = count($filearray);
              $pos = $count - 1;
              $filearray[$pos] = strtolower($filearray[$pos]);
              $file = implode(".",$filearray);
              $dstfile = "$gallerydir/$file";
              rename($srcfile,$dstfile);
            }
          }
          

          这对我有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-19
            • 2017-08-29
            • 2011-07-12
            • 1970-01-01
            相关资源
            最近更新 更多