|
|
|
| Здравствуйте, помогите пожалуйста сделать регулярно выражение чтобы можно было вырезать имя файла из картинки
К примеру вот картинки
<img src="../images/smiles/hello.gif" alt="">
<img src="../images/smiles/).gif" alt="">
<img src="../images/smiles/(.gif" alt="">
вот к примеру из этих трех картинок должно остаться hello, ) и (
меняются только эти названия отсальное все неизменно
с помощью str_replace не пойдет так как в тексте возможны еще картинки, но сдругими путями | |
|
|
|
|
|
|
|
для: Visavi
(22.07.2008 в 18:45)
| |
<?php
preg_match_all('~<img src="\\.\\./images/smiles/(.*?)" alt="">~', $text, $m);
print_r($m[1]);
|
| |
|
|
|
|
|
|
|
для: sms-send
(22.07.2008 в 19:13)
| |
<?php
я сделал вот так
$text= preg_replace('~<img src="\\.\\./images/smiles/(.*?).gif" alt="">~','$1', text);
на выходе все заменяется вроде, надеюсь правильно сделал?
|
| |
|
|
|
|
|
|
|
для: Visavi
(22.07.2008 в 19:44)
| | > надеюсь правильно сделал?
Не совсем. Точку перед "gif" нужно экранировать. Правда этот баг может никогда себя и не проявить. | |
|
|
|
|
|
|
|
для: BinLaden
(22.07.2008 в 20:24)
| | спасибо, исправлю | |
|
|
|
|
|
|
|
для: sms-send
(22.07.2008 в 19:13)
| | >\\.
Зачем, так скажем экранирование экранирования? ;)
Достаточно \. | |
|
|
|
|
|
|
|
для: AcidTrash
(22.07.2008 в 23:16)
| | > Зачем, так скажем экранирование экранирования?
Один - для PHP, другой - для RegExp. Если вдруг в PHP введут новый управляющий символ, то код обрушится. В принципе, конкретно для точки это будет очень наврядли, но всё-таки как-то это честнее. | |
|
|
|
|
|
|
|
для: BinLaden
(22.07.2008 в 23:43)
| | Один - для PHP, другой - для RegExp. Если вдруг в PHP введут новый управляющий символ, то код обрушится
Абсолютно без разницы.
P.S. Может быть пока. | |
|
|
|
|
|
|
|
для: AcidTrash
(23.07.2008 в 00:17)
| | > Абсолютно без разницы
Никто не утверждал, что разница существует. Это лишь эстетически более приятно - писать более правильно. В идеале вообще не должно быть ситуации, где бы одиночный бекслеш стоял бы перед неуправляющим символом. Просто потому, что далеко не все стремятся к идеалу в написании кода, на это закрывают глаза. | |
|
|
|
|
|
|
|
для: BinLaden
(23.07.2008 в 00:31)
| | >Это лишь эстетически более приятно
Интересно чем приятнее? Для меня в данной ситуации проще читать регулярку с одним бекслешом.
>В идеале вообще не должно быть ситуации, где бы одиночный бекслеш стоял бы перед неуправляющим символом
Кто это сказал?
P.S. Хотя кому как. | |
|
|
|
|
|
|
|
для: AcidTrash
(23.07.2008 в 01:10)
| | > Интересно чем приятнее?
Эстетикой.
> Для меня в данной ситуации проще читать регулярку с одним бекслешом.
У людей разные представления о прекрасном, поэтому не удивляйтесь.
> Кто это сказал?
Странная манера разговора у Вас. BinLaden сказал, разве не видно?
Сам по себе бекслеш тоже должен эскейпироваться, поскольку это тоже управляющий символ. Не эскейпируется - значит человек действует на свой страх и риск. | |
|
|
|
|
|
|
|
для: 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, которое в другом языке вызвало бы ошибку парсинга. | |
|
|
|