Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вырезать из картинки
 
 автор: Visavi   (22.07.2008 в 18:45)   письмо автору
 
 

Здравствуйте, помогите пожалуйста сделать регулярно выражение чтобы можно было вырезать имя файла из картинки

К примеру вот картинки
<img src="../images/smiles/hello.gif" alt="">
<img src="../images/smiles/).gif" alt="">
<img src="../images/smiles/(.gif" alt="">

вот к примеру из этих трех картинок должно остаться hello, ) и (
меняются только эти названия отсальное все неизменно

с помощью str_replace не пойдет так как в тексте возможны еще картинки, но сдругими путями

   
 
 автор: sms-send   (22.07.2008 в 19:13)   письмо автору
 
   для: Visavi   (22.07.2008 в 18:45)
 

<?php

preg_match_all
('~<img src="\\.\\./images/smiles/(.*?)" alt="">~'$text$m);
print_r($m[1]);

   
 
 автор: Visavi   (22.07.2008 в 19:44)   письмо автору
 
   для: sms-send   (22.07.2008 в 19:13)
 

<?php
я сделал вот так

$text
preg_replace('~<img src="\\.\\./images/smiles/(.*?).gif" alt="">~','$1'text);
на выходе все заменяется вроденадеюсь правильно сделал?

   
 
 автор: BinLaden   (22.07.2008 в 20:24)   письмо автору
 
   для: Visavi   (22.07.2008 в 19:44)
 

> надеюсь правильно сделал?

Не совсем. Точку перед "gif" нужно экранировать. Правда этот баг может никогда себя и не проявить.

   
 
 автор: Visavi   (22.07.2008 в 20:55)   письмо автору
 
   для: BinLaden   (22.07.2008 в 20:24)
 

спасибо, исправлю

   
 
 автор: AcidTrash   (22.07.2008 в 23:16)   письмо автору
 
   для: sms-send   (22.07.2008 в 19:13)
 

>\\.
Зачем, так скажем экранирование экранирования? ;)
Достаточно \.

   
 
 автор: BinLaden   (22.07.2008 в 23:43)   письмо автору
 
   для: AcidTrash   (22.07.2008 в 23:16)
 

> Зачем, так скажем экранирование экранирования?

Один - для PHP, другой - для RegExp. Если вдруг в PHP введут новый управляющий символ, то код обрушится. В принципе, конкретно для точки это будет очень наврядли, но всё-таки как-то это честнее.

   
 
 автор: AcidTrash   (23.07.2008 в 00:17)   письмо автору
 
   для: BinLaden   (22.07.2008 в 23:43)
 

Один - для PHP, другой - для RegExp. Если вдруг в PHP введут новый управляющий символ, то код обрушится

Абсолютно без разницы.

P.S. Может быть пока.

   
 
 автор: BinLaden   (23.07.2008 в 00:31)   письмо автору
 
   для: AcidTrash   (23.07.2008 в 00:17)
 

> Абсолютно без разницы

Никто не утверждал, что разница существует. Это лишь эстетически более приятно - писать более правильно. В идеале вообще не должно быть ситуации, где бы одиночный бекслеш стоял бы перед неуправляющим символом. Просто потому, что далеко не все стремятся к идеалу в написании кода, на это закрывают глаза.

   
 
 автор: AcidTrash   (23.07.2008 в 01:10)   письмо автору
 
   для: BinLaden   (23.07.2008 в 00:31)
 

>Это лишь эстетически более приятно
Интересно чем приятнее? Для меня в данной ситуации проще читать регулярку с одним бекслешом.
>В идеале вообще не должно быть ситуации, где бы одиночный бекслеш стоял бы перед неуправляющим символом
Кто это сказал?

P.S. Хотя кому как.

   
 
 автор: BinLaden   (23.07.2008 в 01:25)   письмо автору
 
   для: AcidTrash   (23.07.2008 в 01:10)
 

> Интересно чем приятнее?
Эстетикой.

> Для меня в данной ситуации проще читать регулярку с одним бекслешом.
У людей разные представления о прекрасном, поэтому не удивляйтесь.

> Кто это сказал?
Странная манера разговора у Вас. BinLaden сказал, разве не видно?

Сам по себе бекслеш тоже должен эскейпироваться, поскольку это тоже управляющий символ. Не эскейпируется - значит человек действует на свой страх и риск.

   
 
 автор: sms-send   (23.07.2008 в 02:27)   письмо автору
 
   для: AcidTrash   (22.07.2008 в 23:16)
 

Задача: написать рег. выражение, которое ищет все кавычки, перед которыми не стоит бэкслэш.

Ставим 1 бэкслэш - он экранирует скобку в PCRE:
preg_match_all('~(?<!\)["\']~', $text, $m);


Ставим 2 бэкслэша - первый экранирует второго на уровне PHP-интерпретатора и в PCRE опять же попадает 1 бэкслэш, который экранирует скобку:
preg_match_all('~(?<!\\)["\']~', $text, $m);


Ставим 3 бэкслэша - первый экранирует второго на уровне PHP-интерпретатора, третий проходит без изменений, в итоге до PCRE доходят 2 бэкслэша, первый из которых - экранирующий для второго:
preg_match_all('~(?<!\\\)["\']~', $text, $m);

Всё верно.
А теперь смотрим, насколько удобно ^это^ читать и понимать?)

Мне проще знать, что на каждом этапе парсеры уменьшают кол-во слэшэй в 2 раза и не заморачиваться над подобными ошибками-невидимками. Четыре слеша, после прохода через 2 парсера превращаются в один неуправляющий:

preg_match_all('~(?<!\\\\)["\']~', $text, $m);


Меняем задачу: написать рег. выражение, которое ищет все кавычки, перед которыми не стоят 2 бэкслэша.
Просто дописываем ещё 4 бэкслэша в регулярку:

preg_match_all('~(?<!\\\\\\\\)["\']~', $text, $m);


А вообще это очередное "очень нужное допущение" разработчиков языка PHP, которое в другом языке вызвало бы ошибку парсинга.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования