Как я могу изменить расширение файла с помощью PHP? - PullRequest
24 голосов
/ 11 октября 2008

Как я могу изменить расширение файла с помощью PHP?

Например: photo.jpg to photo.exe

Ответы [ 11 ]

40 голосов
/ 04 сентября 2011

В современных операционных системах имена файлов вполне могут содержать периоды задолго до расширения файла, например:

my.file.name.jpg

PHP предоставляет способ найти имя файла без расширения, которое учитывает это, а затем просто добавить новое расширение:

function replace_extension($filename, $new_extension) {
    $info = pathinfo($filename);
    return $info['filename'] . '.' . $new_extension;
}
21 голосов
/ 11 февраля 2011
substr_replace($file , 'png', strrpos($file , '.') +1)

Изменит любое расширение на то, что вы хотите. Замените png на то, каким будет желаемое расширение.

10 голосов
/ 06 февраля 2013

Заменить расширение, сохранить информацию о пути

function replace_extension($filename, $new_extension) {
    $info = pathinfo($filename);
    return ($info['dirname'] ? $info['dirname'] . DIRECTORY_SEPARATOR : '') 
        . $info['filename'] 
        . '.' 
        . $new_extension;
}
8 голосов
/ 11 октября 2008

Когда у вас есть имя файла в строке, сначала используйте регулярное выражение, чтобы заменить расширение на расширение по вашему выбору. Вот небольшая функция, которая сделает это:

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

Затем используйте функцию rename () , чтобы переименовать файл с новым именем файла.

7 голосов
/ 11 октября 2008
3 голосов
/ 13 февраля 2015

Лучше:

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

Изменения сделаны только в части расширения. Оставляет другую информацию без изменений.

Это безопасно.

3 голосов
/ 29 ноября 2012

Просто замените его регулярным выражением:

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

Вы также можете расширить этот код, чтобы удалить другие расширения изображения, не только bmp:

$filename = preg_replace('"\.(bmp|gif)$"', '.jpg', $filename);
1 голос
/ 14 октября 2017

Вы можете использовать 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);
1 голос
/ 19 октября 2014

Для поклонников регулярных выражений, модифицированная версия решения Thanh Trung 'preg_replace', которое всегда будет содержать новое расширение (так что если вы напишите программу преобразования файлов, вы не будете случайно перезаписывать исходный файл с результатом), будет:

preg_replace('/\.[^.]+$/', '.', $file) . $extension
0 голосов
/ 08 января 2019

Было предложено много хороших ответов. Я подумал, что было бы полезно оценить и сравнить их производительность . Вот результаты:

  • ответ Тони Маро (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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...