[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Regex для изменения JPG и JPEG к jpg и jpeg
skolozhabskiy
добрый вечер!

на сервере возникла проблема с файлами изображений, которые имеют расширение JPG или JPEG (все символы в верхнем регистре). Скрипт понимает только расширение в нижнем регистре.

я использую такой код, чтобы заменить JPG на jpg:

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

$filename = 'test/temp/SDC168263.JPG';
$new_extension = 'jpg'; или $new_extension = 'jpeg'; // здесь проблема выбора далее

if ( preg_match("/\.JP[E]?G$/", $filename) )
{
echo '<br />filename = '.replace_extension($filename, $new_extension); // здесь проблема выбора
}
else
{
echo '<br />filename = '.$filename;
}

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

спасибо



Спустя 4 минуты, 9 секунд (24.07.2012 - 22:53) rooor написал(а):
не понял... strtolower() не поможет?

Спустя 1 минута, 1 секунда (24.07.2012 - 22:54) skolozhabskiy написал(а):
нет такое решение не подходит, имя файла изменять как и путь не нужно, здесь тоже критично. нужно изменить только расширение файла и только конкретного. Речь идет о расширении в верхнем регистре, которое, к сожалению, препятствует открытию файлов. спасибо

Спустя 15 минут, 59 секунд (24.07.2012 - 23:10) Invis1ble написал(а):
$filename = 'SOMENAME.JPEG';
echo preg_replace('#\.jpe?g$#ie', 'strtolower("$0")', $filename);

Спустя 14 минут, 54 секунды (24.07.2012 - 23:25) skolozhabskiy написал(а):
Invis1ble
спасибо за ответ, а что это за конструкция strtolower("$0"). я впервые встречаю такую. и для других файлов с расширением в верхнем регистре (PNG, GIF) такое решение правильное:

echo preg_replace('#\.jpe?g|png|gif$#ie', 'strtolower("$0")', $filename);

есть еще какие-то идеи?

спасибо

Спустя 13 минут, 58 секунд (24.07.2012 - 23:39) Placido написал(а):
Цитата (Invis1ble @ 24.07.2012 - 23:10)
<pre class="sh_sourceCode" rel="php"><span class="sh_variable">$filename</span> <span class="sh_symbol">=</span> <span class="sh_string">'SOMENAME.JPEG'</span><span class="sh_symbol">;</span>
<span class="sh_function">echo preg_replace</span><span class="sh_symbol">(</span><span class="sh_string">'#\.jpe?g$#ie'</span><span class="sh_symbol">...</span></pre>

По поводу модификатора "e":
Цитата
Предостережение
Использовать этот модификатор не рекомендуется, так как это может легко добавить уязвимости в системе безопасности...
Для предотвращения этого типа уязвимости с удаленным исполнением кода следует использовать функцию preg_replace_callback()...

http://www.php.net/manual/ru/reference.pcr...n.modifiers.php

Еще одно решение:
$filename = 'SOMENAME.JPEG';
echo preg_replace_callback('#\.jpe?g|png|gif$#i', function($match){return strtolower($match[0]);}, $filename);

Спустя 7 минут, 6 секунд (24.07.2012 - 23:46) Invis1ble написал(а):
Placido
пример атаки через мой код в студию smile.gif

Цитата
Еще одно решение:

которое не будет работать с PHP < 5.3

Спустя 4 минуты, 33 секунды (24.07.2012 - 23:51) skolozhabskiy написал(а):
Placido


$filename = 'SOMENAME.JPEG';
echo preg_replace_callback('#\.jpe?g|png|gif$#i', function($match){return strtolower($match[0]);}, $filename);


это самое краткое и оптимальное решение?

спасибо

Спустя 10 минут (25.07.2012 - 00:01) Placido написал(а):
Цитата (Invis1ble @ 24.07.2012 - 23:46)
Placido
пример атаки через мой код в студию  :)

Цитата
Еще одно решение:

которое не будет работать с PHP < 5.3

Я говорил об атаках или о версиях? Я привел цитату с официального сайта PHP и предложил (дословно) "еще одно решение". А если вместо анонимной функции использовать create_function()
$filename = 'SOMENAME.GiF';
echo preg_replace_callback('#\.jpe?g|png|gif#i', create_function('$match','{return strtolower($match[0]);}'), $filename);

(изменить код займет секунд 20), то работать это решение будет, начиная с версии PHP 4.0.5.

Спустя 1 минута, 17 секунд (25.07.2012 - 00:02) Invis1ble написал(а):
Placido
Цитата
Я привел цитату с официального сайта PHP

Для чего, если в данном случае это не актуально?

Спустя 1 минута, 46 секунд (25.07.2012 - 00:04) Placido написал(а):
Цитата (Invis1ble @ 25.07.2012 - 00:02)
Placido
Цитата
Я привел цитату с официального сайта PHP

Для чего, если в данном случае это не актуально?

Для того, чтобы аскер знал о потенциальной небезопасности использования модификатора "e".

Спустя 1 минута, 48 секунд (25.07.2012 - 00:05) Invis1ble написал(а):
Placido
ок, я просто принял это на свой счет и поэтому попросил пример атаки

Спустя 1 минута, 45 секунд (25.07.2012 - 00:07) skolozhabskiy написал(а):
спасибо за дискуссию, но что же наиболее верно:

echo preg_replace_callback('#\.jpe?g|png|gif#i', create_function('$match','{return strtolower($match[0]);}'), $filename);

или

echo preg_replace_callback('#\.jpe?g|png|gif$#i', function($match){return strtolower($match[0]);}, $filename);

спасибо

Спустя 1 минута, 9 секунд (25.07.2012 - 00:08) Invis1ble написал(а):
skolozhabskiy
оба варианта верны, но 2-й не будет работать с версией ниже 5.3
а чем тебя мой вариант не устраивает, не пойму?

Спустя 3 минуты, 16 секунд (25.07.2012 - 00:12) skolozhabskiy написал(а):
если профессионал считает, что есть уязвимость, то не лучше ли прислушаться к его мнению?

спасибо

Спустя 3 минуты, 8 секунд (25.07.2012 - 00:15) Invis1ble написал(а):
skolozhabskiy
Цитата
если профессионал считает, что есть уязвимость, то не лучше ли прислушаться к его мнению?

не читай через пост

Спустя 19 секунд (25.07.2012 - 00:15) Placido написал(а):
Цитата (skolozhabskiy @ 25.07.2012 - 00:12)
если профессионал считает, что есть уязвимость, то не лучше ли прислушаться к его мнению?

спасибо

Я не профессионал, я только учусь.))) А вот Invis1ble стоит слушать - он плохого не посоветует.

Спустя 2 минуты, 38 секунд (25.07.2012 - 00:18) Invis1ble написал(а):
Цитата
Я не профессионал, я только учусь.)))

все мы здесь учимся, нет предела совершенству smile.gif

Спустя 4 минуты, 23 секунды (25.07.2012 - 00:22) Placido написал(а):
Цитата (skolozhabskiy @ 25.07.2012 - 00:12)
если профессионал считает, что есть уязвимость, то не лучше ли прислушаться к его мнению?

спасибо

Применительно к вашему случаю вариант Invis1ble подходит по всем параметрам и, к тому же, он самый лаконичный. Я же здесь отписался только с целью заострить ваше внимание на том, что модификатор "e" нужно использовать с осторожностью.

Спустя 13 минут, 51 секунда (25.07.2012 - 00:36) skolozhabskiy написал(а):
спасибо всем, я благодарен вам за столь квалифицированную дискуссию.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.