RegEx - Как вставить строку перед расширением файла - PullRequest
23 голосов
/ 12 марта 2010

Как бы я вставил "_thumb" в файлы, которые генерируются с помощью дианмики.

Например, у меня есть сайт, который позволяет пользователям загружать изображения. Скрипт берет изображение, оптимизирует его и сохраняет в файл. Как бы заставить вставлять строку "_thumb" для оптимизированного изображения?

В настоящее время я сохраняю 1 версию файла otpimized. ч-1268312613-photo.jpg

Я хочу сохранить оригинал как указанную выше строку, но хочу добавить «_thumb» как следующую строку ч-1268312613-photo_thumb.jpg

Ответы [ 6 ]

40 голосов
/ 12 марта 2010

Нет необходимости использовать регулярные выражения. Это сделает это:

$extension_pos = strrpos($filename, '.'); // find position of the last dot, so where the extension starts
$thumb = substr($filename, 0, $extension_pos) . '_thumb' . substr($filename, $extension_pos);
14 голосов
/ 12 марта 2010

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

$ext   = pathinfo($filename, PATHINFO_EXTENSION);
$thumb = basename($filename, ".$ext") . '_thumb.' . $ext;

Редактировать : @tanascius извините за очень похожий ответ, думаю, мне следовало проверить маленькое всплывающее окно во время написания этого (это заняло некоторое время, я отвлекся).

4 голосов
/ 12 марта 2010

Почему вы хотите использовать RegEx? Всегда ли расширение .jpg и есть только одно расширение? Может быть, вы можете заменить его на _thumb.jpg?

Если не все так просто, вы можете использовать такую ​​функцию, как pathinfo , чтобы извлечь расширение basename + и выполнить там замену. Это работает и без регулярных выражений, что может быть излишним:

$info = pathinfo( $file );
$no_extension =  basename( $file, '.'.$info['extension'] );
echo $no_extension.'_thumb.'.$info['extension']
2 голосов
/ 12 марта 2010

Предполагая, что в строке встречается только «.jpg», вы можете вместо * regex

сделать str_replace
$filename = str_replace(".jpg", "_thumb.jpg", $filename);

или даже лучше, substr_replace, чтобы просто вставить строку где-то посередине:

$filename = substr_replace($filename, '_thumb', -4, 0);
2 голосов
/ 12 марта 2010
 preg_replace("/(\w+)\.(\w+)/","'\\1_thumb.\\2'","test.jpg"); 

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

Но я признаю, что решение Чада элегантно и эффективно

1 голос
/ 12 марта 2010
$str = "ch-1268312613-photo.jpg";
print preg_replace("/\.jpg$/i","_thumb.jpg",$str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...