Секреты регулярных выражений: ключи результирующего массива
Мало кто знает о возможности задавать ключи результирующего массива, при использовании функции 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';
Полученный результат:


