簡體   English   中英

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

[英]How can I change a file's extension using PHP?

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

例如:photo.jpg 到 photo.exe

在現代操作系統中,文件名很可能在文件擴展名之前包含很長時間的句點,例如:

my.file.name.jpg

PHP 提供了一種無需擴展名即可查找文件名的方法,考慮到這一點,然后只需添加新擴展名:

function replace_extension($filename, $new_extension) {
    $info = pathinfo($filename);
    return $info['filename'] . '.' . $new_extension;
}
substr_replace($file , 'png', strrpos($file , '.') +1)

將任何擴展更改為您想要的。 將 png 替換為您想要的擴展名。

替換擴展名,保留路徑信息

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

在字符串中包含文件名后,首先使用正則表達式將擴展名替換為您選擇的擴展名。 這是一個可以做到這一點的小函數:

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

然后使用rename()函數用新文件名重命名文件。

只需用正則表達式替換它:

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

您還可以擴展此代碼以刪除其他圖像擴展名,而不僅僅是 bmp:

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

對於正則表達式愛好者,Thanh Trung 的“preg_replace”解決方案的修改版本將始終包含新擴展名(這樣如果您編寫文件轉換程序,您不會意外地用結果覆蓋源文件)將是:

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

更好的方法:

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

僅對擴展部分進行更改。 保持其他信息不變。

它是安全的。

您可以使用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);

已經提出了許多好的答案。 我認為評估和比較他們的表現會很有幫助。 結果如下:

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

我喜歡strrpos()方法,因為它非常快速和直接 - 但是,您必須首先檢查以確保文件名有任何擴展名。 這是一個 function,它的性能非常好,將替換現有的擴展或添加一個新的擴展(如果不存在):

function replace_extension($filename, $extension) {
    if (($pos = strrpos($filename , '.')) !== false) {
        $filename = substr($filename, 0, $pos);
    }
    return $filename . '.' . $extension;
}

我需要它來將所有帶有圖庫的圖像擴展名更改為小寫。 我最終做了以下事情:

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

這對我的目的有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM