Как я могу изменить расширение файла с помощью PHP?
Как я могу изменить расширение файла с помощью PHP?
Пример: photo.jpg в photo.exe
12 ответов
Мне нужно было это изменить все расширения изображений с помощью галереи в нижний регистр. Я закончил тем, что сделал следующее:
// 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);
}
}
Это сработало для моих целей.
В современных операционных системах имена файлов очень хорошо могут содержать периоды задолго до расширения файла, например:
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;
}
Когда у вас есть имя файла в строке, сначала используйте regex, чтобы заменить расширение на расширение по вашему выбору. Вот небольшая функция, которая сделает это:
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);
мне нравитсяstrrpos()
подход, потому что он очень быстрый и простой — однако вы должны сначала убедиться, что имя файла вообще имеет какое-либо расширение. Вот функция, которая чрезвычайно эффективна и заменит существующее расширение или добавит новое, если его не существует :
function replace_extension($filename, $extension) {
if (($pos = strrpos($filename , '.')) !== false) {
$filename = substr($filename, 0, $pos);
}
return $filename . '.' . $extension;
}
Было предложено много хороших ответов. Я подумал, что было бы полезно оценить и сравнить их эффективность. Вот результаты:
- ответ Тони Маро (
pathinfo
) заняло 0,000031040740966797 секунд. Примечание. Недостатком является отсутствие полного пути. - ответ Мэтта (
substr_replace
) заняло 0,000010013580322266 секунд. - ответ Джереми Рутена (
preg_replace
) заняло 0.00070095062255859 секунд.
Поэтому я бы предложил substr_replace
, так как это проще и быстрее, чем другие.
Как примечание, есть следующее решение, которое заняло 0,000014066696166992 секунды. Все еще не мог победить substr_replace
:
$parts = explode('.', $inpath);
$parts[count( $parts ) - 1] = 'exe';
$outpath = implode('.', $parts);