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

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

Пример: photo.jpg в photo.exe.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
32
0
65 327
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

http://www.php.net/rename

Что, если вы используете переменную в качестве имени файла?

PHLAK 11.10.2008 11:42

Функция принимает строки, не имеет значения, являются ли эти строки строковыми литералами или строковыми переменными.

Quentin 11.10.2008 13:05

@me_ - Почему вы жалуетесь на то, что это не ответ мне? Я просто прокомментировал на нем почти десятилетие назад.

Quentin 30.01.2018 21:54

@me_ - То, что OP не понимает фундаментальных основ языка программирования, прежде чем задавать вопрос о конкретной задаче, не означает ответ, предполагающий, что эти знания плохие. Если да, то каждый ответ должен включать вводное руководство по программированию.

Quentin 30.01.2018 22:26

@me_ - что не имеет ничего общего с OP, не знающим основ вроде «Строка - это строка, происходит ли она из строкового литерала или переменной».

Quentin 30.01.2018 23:07

@me_ - Это просто возвращает нас к моему предыдущему комментарию. Если вы думаете, что это некачественный ответ, потому что это ответ только по ссылке, почему вы направили свой комментарий на меня, чтобы я объяснил то, что этот ответ не удосужился бы объяснить, если бы это был не только ответ по ссылке? Направьте свой комментарий на человека, написавшего ответ! Или просто отметьте его как низкое качество и двигайтесь дальше!

Quentin 30.01.2018 23:16

@me_ - Вы добавили к комментарию префикс «@Quentin». Это направило его на меня.

Quentin 30.01.2018 23:41

@me_ - Десять лет назад. Пусть отдыхает.

Quentin 30.01.2018 23:44

@me_ - Посмотрите, когда был дан ответ. Посмотрите на дату, когда я «расширил вопрос об отсутствии ответа». Подумайте, какой у меня был опыт работы со Stackoverflow на тот день. Учтите, что с тех пор рекомендации по использованию StackOverflow могли измениться. Тогда дайте ему отдохнуть.

Quentin 30.01.2018 23:49

Какие? Я не это сказал. Я неоднократно просил вас отбросить эту тему. Вы не сделали. Впредь я просто буду игнорировать тебя.

Quentin 30.01.2018 23:55

никто не просил вас написать книгу по этому поводу, это всегда был личный выбор ...

me_ 30.01.2018 23:57

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

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

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

На самом деле это плохая идея. В современных операционных системах имена файлов могут содержать точки внутри имени, например, при изменении расширения на «.tif», «this.is.a.test.pdf» при использовании в этом случае удаляет его до «this.tif». используйте: $ info = pathinfo ($ filename); вернуть $ info ['имя_файла']. "." . $ new_extension;

Tony Maro 04.09.2011 02:19

preg_replace('/\.[^.]+$/', '.' . $extension, $file) соответствует последнему найденному ., но не будет работать, если файл не имеет расширения

Thanh Trung 03.07.2013 13:35

Мне нужно было изменить все расширения изображений в галерее на строчные. В итоге я сделал следующее:

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

Это сработало для моих целей.

substr_replace($file , 'png', strrpos($file , '.') +1)

Поменяю любое расширение на то, что вы хотите. Замените png любым желаемым расширением.

Предупреждение: это испортит ваше имя файла, если не найдет расширения.

Moradnejad 08.01.2019 11:09
Ответ принят как подходящий

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

my.file.name.jpg

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

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

Для меня это лучший ответ, потому что он использует функцию в PHP для того, для чего он был разработан. Он также выполняет вычисления за одну команду, что означает меньше кода C в внутренностях PHP.

Volomike 29.10.2011 03:18

Я думаю, это должно сохранить информацию о пути: return $ info ['dirname']. "/". $ Info ['filename']. '.' . $ new_extension;

James T Snell 02.01.2014 08:46

Без пути это может привести к поломке вашего приложения!

Guilherme Sampaio 31.07.2020 21:01

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

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

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

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

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

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

Лучший ответ! Осторожно, DS не подходит в этой ситуации

Thanh Trung 03.07.2013 13:38

О боже ... Я так привык к Magento, где они определяют DS = DIRECTORY_SEPARATOR. Отредактировал свой ответ. Спасибо.

Alex 06.07.2013 00:47

Может быть, это небезопасно, потому что меняют не только расширение. Например, в Windows можно заменить один разделитель на другой.

Enyby 13.02.2015 18:05

@Enyby: что ты имеешь в виду? У вас есть нерабочий пример имени?

Alex 13.02.2015 18:11

'c: \\ windows \\ system32 / drivers / etc / some.file..png' - изменение на 'jpg' даст следующий результат: 'c: \\ windows \\ system32 / drivers / etc \ some.file. .jpg '- разделитель перед изменением имени файла. В некоторых случаях это может вызвать некоторые побочные эффекты.

Enyby 13.02.2015 18:40

Это недопустимый путь Windows, который вы проходите. все должны быть обратными косыми чертами - без косых черт. Используйте DIRECTORY_SEPARATOR при создании пути.

Alex 13.02.2015 19:08

Собственно говоря, ты прав. Но дело в том, что - php позволяет смешивать два разделителя для Windows. Например, is_dir ('c: \\ windows \\ system32 / drivers / etc') вернет истину. Поэтому предупреждаю о возможных побочных эффектах.

Enyby 13.02.2015 19:27

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

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

Это умное решение. Используя регулярное выражение для простого удаления расширения, а затем используя конкатенацию строк для применения нового расширения, оно работает в большем количестве условий, чем любое из других предоставленных решений.

Ryan Williams 15.11.2016 03:47

Лучший путь:

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

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

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

Если файл не имеет расширения, он заменит полное имя файла.

klodoma 17.01.2020 17:34

@klodoma Ага. Но вопрос о переходе с одного расширения на другое. Так что ожидать некоторого расширения.

Enyby 17.01.2020 22:31

Я понимаю; Стоит хотя бы уточнить это в ответе.

klodoma 17.01.2020 23:43

Вы можете использовать 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($oldname, $newname);

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

  • Ответ Тони Маро (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);

Другие вопросы по теме