





Функция принимает строки, не имеет значения, являются ли эти строки строковыми литералами или строковыми переменными.
@me_ - Почему вы жалуетесь на то, что это не ответ мне? Я просто прокомментировал на нем почти десятилетие назад.
@me_ - То, что OP не понимает фундаментальных основ языка программирования, прежде чем задавать вопрос о конкретной задаче, не означает ответ, предполагающий, что эти знания плохие. Если да, то каждый ответ должен включать вводное руководство по программированию.
@me_ - что не имеет ничего общего с OP, не знающим основ вроде «Строка - это строка, происходит ли она из строкового литерала или переменной».
@me_ - Это просто возвращает нас к моему предыдущему комментарию. Если вы думаете, что это некачественный ответ, потому что это ответ только по ссылке, почему вы направили свой комментарий на меня, чтобы я объяснил то, что этот ответ не удосужился бы объяснить, если бы это был не только ответ по ссылке? Направьте свой комментарий на человека, написавшего ответ! Или просто отметьте его как низкое качество и двигайтесь дальше!
@me_ - Вы добавили к комментарию префикс «@Quentin». Это направило его на меня.
@me_ - Десять лет назад. Пусть отдыхает.
@me_ - Посмотрите, когда был дан ответ. Посмотрите на дату, когда я «расширил вопрос об отсутствии ответа». Подумайте, какой у меня был опыт работы со Stackoverflow на тот день. Учтите, что с тех пор рекомендации по использованию StackOverflow могли измениться. Тогда дайте ему отдохнуть.
Какие? Я не это сказал. Я неоднократно просил вас отбросить эту тему. Вы не сделали. Впредь я просто буду игнорировать тебя.
никто не просил вас написать книгу по этому поводу, это всегда был личный выбор ...
Если у вас есть имя файла в строке, сначала используйте регулярное выражение, чтобы заменить расширение на расширение по вашему выбору. Вот небольшая функция, которая сделает это:
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;
preg_replace('/\.[^.]+$/', '.' . $extension, $file) соответствует последнему найденному ., но не будет работать, если файл не имеет расширения
Мне нужно было изменить все расширения изображений в галерее на строчные. В итоге я сделал следующее:
// 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 любым желаемым расширением.
Предупреждение: это испортит ваше имя файла, если не найдет расширения.
В современных операционных системах имена файлов могут содержать точки задолго до расширения файла, например:
my.file.name.jpg
PHP предоставляет способ найти имя файла без расширения, которое учитывает это, а затем просто добавьте новое расширение:
function replace_extension($filename, $new_extension) {
$info = pathinfo($filename);
return $info['filename'] . '.' . $new_extension;
}
Для меня это лучший ответ, потому что он использует функцию в PHP для того, для чего он был разработан. Он также выполняет вычисления за одну команду, что означает меньше кода C в внутренностях PHP.
Я думаю, это должно сохранить информацию о пути: return $ info ['dirname']. "/". $ Info ['filename']. '.' . $ new_extension;
Без пути это может привести к поломке вашего приложения!
Просто замените его на регулярное выражение:
$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 не подходит в этой ситуации
О боже ... Я так привык к Magento, где они определяют DS = DIRECTORY_SEPARATOR. Отредактировал свой ответ. Спасибо.
Может быть, это небезопасно, потому что меняют не только расширение. Например, в Windows можно заменить один разделитель на другой.
@Enyby: что ты имеешь в виду? У вас есть нерабочий пример имени?
'c: \\ windows \\ system32 / drivers / etc / some.file..png' - изменение на 'jpg' даст следующий результат: 'c: \\ windows \\ system32 / drivers / etc \ some.file. .jpg '- разделитель перед изменением имени файла. В некоторых случаях это может вызвать некоторые побочные эффекты.
Это недопустимый путь Windows, который вы проходите. все должны быть обратными косыми чертами - без косых черт. Используйте DIRECTORY_SEPARATOR при создании пути.
Собственно говоря, ты прав. Но дело в том, что - php позволяет смешивать два разделителя для Windows. Например, is_dir ('c: \\ windows \\ system32 / drivers / etc') вернет истину. Поэтому предупреждаю о возможных побочных эффектах.
Для поклонников регулярных выражений, модифицированная версия решения Thanh Trung 'preg_replace', которая всегда будет содержать новое расширение (так что если вы напишете программу преобразования файлов, вы случайно не перезапишете исходный файл результатом) будет:
preg_replace('/\.[^.]+$/', '.', $file) . $extension
Это умное решение. Используя регулярное выражение для простого удаления расширения, а затем используя конкатенацию строк для применения нового расширения, оно работает в большем количестве условий, чем любое из других предоставленных решений.
Лучший путь:
substr($filename, 0, -strlen(pathinfo($filename, PATHINFO_EXTENSION))).$new_extension
Изменения внесены только в удлинительную часть. Остальная информация остаётся без изменений.
Это безопасно.
Если файл не имеет расширения, он заменит полное имя файла.
@klodoma Ага. Но вопрос о переходе с одного расширения на другое. Так что ожидать некоторого расширения.
Я понимаю; Стоит хотя бы уточнить это в ответе.
Вы можете использовать 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);
Что, если вы используете переменную в качестве имени файла?