如何使用 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;
}

您可以使用rename(string $from, string $to, ?resource $context = null)函数。

在字符串中包含文件名后,首先使用regex将扩展名替换为您选择的扩展名。这里有一个小功能可以做到这一点:

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

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

只需将其替换为regexp:

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

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

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

对于regex粉丝,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秒。注意:它的缺点是不包括完整路径
  • 马特(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 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);
  }
}

这符合我的目的。

相关内容

  • 没有找到相关文章

最新更新