на сервере возникла проблема с файлами изображений, которые имеют расширение 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) такое решение правильное:
есть еще какие-то идеи?
спасибо
спасибо за ответ, а что это за конструкция 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](http://phpforum.su/html/emoticons/smile.gif)
пример атаки через мой код в студию
![smile.gif](http://phpforum.su/html/emoticons/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
Для чего, если в данном случае это не актуально? |
Для того, чтобы аскер знал о потенциальной небезопасности использования модификатора "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
а чем тебя мой вариант не устраивает, не пойму?
оба варианта верны, но 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](http://phpforum.su/html/emoticons/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 написал(а):
спасибо всем, я благодарен вам за столь квалифицированную дискуссию.