Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > регулярка


Автор: Frozen_Coyote 1.10.2014, 15:00
Привет ребят!

Тут у меня небольшая непонятка, прошу компетентных лиц разъяснить! smile

задача: ищем с помощью функции preg_match_all в html тексте картинки, но не все, а те, у которых атрибут id="img_некое_число"

пишем (все, подчеркиваю, по моей, как уже понятно, неправильной логике)

Код

preg_match_all("/<img\s.+?id=\"img.+?\".+?>/Uis", $Txt, $found);


что мы видим в итоге

Код

[0] => Array
        (
            [0] => <img title="Картинка 1" id="img_834821" alt="Картинка 1" src="путь">
            [1] => <img src="/img/mag_glass.png" style="vertical-align: middle" alt="" title="" border="0" /></span></span>&nbsp;<span class="img_line"><img title="Картинка 2" id="img_997501" alt="Картинка 2" src="путь">
            [2] => <img title="Картинка 3" id="img_348851" alt="Картинка 3" src="путь">
            [3] => <img src="/img/mag_glass.png" style="vertical-align: middle" alt="" title="" border="0" /></span></span>&nbsp;<span class="img_line"><img title="Картинка 4" id="img_378591" alt="Картинка 4" src="путь">
        )


элементы 0 и 2 - то что надо, а вот 1 и 3 - к ним спереди прицепился ненужный довесок. Вроде от жадности модификатором отучено. Объясните почему и как устранить? Спасибо smile

Автор: AVA12 1.10.2014, 17:01
Вот так всегда - пытаются решить проблему с помощью магического регвыра, а в результате получают две проблемы.

Сделал модификаторы повторения нежадными? Правильно, но недостаточно. Где в регвыре сказано, что ид должен присутствовать именно в искомом теге? Нигде. В результате захватывается кусок документа до ближайшего подходящего ид.

В данном случае проблема все-таки решается регвыром: нужно заменить класс "любой символ" на "не правая угловая скобка", т. е. заменить . на [^>]

Автор: Gold Dragon 20.10.2014, 13:54
Попробуй так
Код

preg_match_all("#<img[^>]*?id=(\"|\')img_[\d]+(\"|\')[^>]*?>#/isg", $Txt, $found);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)