Главная страница / Техногрет / Полезные заметки / Секреты регулярных выражений: ключи результирующего массива

4 марта 2009

Секреты регулярных выражений: ключи результирующего массива

Мало кто знает о возможности задавать ключи результирующего массива, при использовании функции preg_match_all, прямо из шаблона регулярного выражения
Нигде ранее я не встречал похожего приема, пока не стал разбирать код ЗендФреймворка.

Допустим, нам требуется распарсить чужой сайт на предмет новостей.

Мы знаем заранее, что новостей много и внешний вид искомых нами ссылок выглядит следующим образом:

<a href="/news123.html" class=txt_big15>Девочка Мика принимает ванну</a>

<a href="/news/1234.html" class=txt_big15>Катя одевает лифчик</a>

Напишем регулярку:

#<a href="(/news/[^"]*)" class=txt_big15>([^<]*)</a>#Um

И получим результат:

Как видим, сработал модификатор «жадности» и у нас появился лишний массив с ключом 0. Если, мы захотим написать универсальный парсер для любых сайтов, который бы хранил шаблон регулярных выражений отдельно от логики разбора полученных результатов, мы придем в тупик.

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

Делается это так:

(?P<ключ>шаблон выражения)

Например. Выберем все ссылки в массив source, а заголовки ссылок в массив title.

'#<a href="(?P<source>/news/[^"]*)" class=txt_big15>(?P<title>[^<]*)</a>#Um';

Полученный результат:

© Weltkind 2008
validator