Xpoint
   [напомнить пароль]

Собрать регуляркой данные из html

Метки: [без меток]
2015-03-25 23:25:29 [обр] Роман[досье]

Приветствую!
Прошу помочь разобраться с регуляркой.

Есть следующий html код:

<div id="ColourDropDown">
<ul>
<li><a data-value="1" href="javascript:void(0)">Вишневый</a></li>
                                    
<li><a data-value="2" href="javascript:void(0)">Экрю</a></li>
                                    
<li><a data-value="3" href="javascript:void(0)">Черный</a></li>
                                    
<li><a data-value="4" href="javascript:void(0)">Розовый</a></li>
                                    
</ul>
</div>

<div id="SizeDropDown">
<ul>
<li><a data-value="1" href="javascript:void(0)">X</a></li>
                                    
<li><a data-value="2" href="javascript:void(0)">XL</a></li>
                                    
<li><a data-value="3" href="javascript:void(0)">XXL</a></li>
                                    
<li><a data-value="4" href="javascript:void(0)">XXXL</a></li>
                                    
</ul>
</div>

Требуется собрать значения списка ColourDropDown

регулярка ~<div id="ColourDropDown">[^<]*<ul>(?:[^<]*<li>[^<]*<a data-value="\d+" href="[^"]*">([^<]*)</a></li>[^<]*).*?</ul>~is - собирает только "Вишневый"
регулярка ~<div id="ColourDropDown">[^<]*<ul>(?:[^<]*<li>[^<]*<a data-value="\d+" href="[^"]*">([^<]*)</a></li>[^<]*)*.*?</ul>~is - собирает только "Розовый"
при искользовании квантификатора типа {0,n} - собирает значение n или максимальное из найденых по шаблону т.е
~<div id="ColourDropDown">[^<]*<ul>(?:[^<]*<li>[^<]*<a data-value="\d+" href="[^"]*">([^<]*)</a></li>[^<]*){0,2}.*?</ul>~is - дает Экрю
а
~<div id="ColourDropDown">[^<]*<ul>(?:[^<]*<li>[^<]*<a data-value="\d+" href="[^"]*">([^<]*)</a></li>[^<]*){0,20}.*?</ul>~is - дает Розовый

как получить все значения 1й регуляркой не понимаю, ведь судя по результатам под этот шаблон подходят все элементы списка

Подскажите плз, у кого какие идеи ))

спустя 3 часа 6 минут [обр] Евгений Седов aka KPbIC(7/176)[досье]
спустя 7 часов [обр] Роман[досье]
Нет, к сожалению ни модули, ни форичи мне не подойдут.
Интерфейс заточен так, что надо сделать сие 1й регуляркой.
Очень интересно почему регулярка в зависимости от квантификатора берет либо первое, либо последнее значение, хотя под этот шаблон подходят все элементы
спустя 3 часа 36 минут [обр] Jared(3/26)[досье]

Роман[досье] значит надо менять ваш интерфейс. Такие вещи делаются с помощью HTML/XML парсеров и применение регулярок здесь в 95% случаев попытка прострелить себе ногу. Да и вообще "Некоторые люди, во время решения одной проблемы думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы… "

В этом случае вы вообще строите каких-то монстриков, описывая зачем-то всю структуру это вашего HTML'a. Ваша задача матчить определенные элементы "a" - вот этим и займитесь:

<a [^>]+>([^<]+)</a>(?=.*SizeDropDown)(?!.*ColourDropDown)

Ищем все элементы "а" после которых встречается подстрока "SizeDropDown" и не встречается "ColourDropDown" (для исключения ссылок до div.ColourDropDown).

Powered by POEM™ Engine Copyright © 2002-2005