parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Не жадные регулярные выражения

zDenis 04.03.2003 01:51

Собственно, хотел вопрос задать, но пока писал, почитал доку по Перлу и вопрос разрешился, но написать все таки хочу, в назидание, так сказать, потомкам.
В Parser'е работает фича, делающая регулярные выражения "не жадными". Что это такое?
Есть строка, скажем, такая:
...
<parser>какой_то_метод[]</parser>ля-ля-тополя...
очень много всякого текста...
<parser>другой_метод[]</parser>.
...
Захотели отматчить ее так, чтобы содержимое тега <parser></parser> отпроцессилось в @postprocess'е
Вот так:
@postprocess[buffer]
$result[^buffer.match[<parser>(.+)</parser>][ig]{^process{^^$match.1}}]
не пойдет, потому что рег. выражения по умолчанию жадные, и результатом такого постпроцесса будет выполнение всего кода между первым <parser> и последним (в данном случае вторым) </parser>, включая текст "ля-ля-тополя...очень много всякого текста..." чего мы не хотели.
А чтобы этого не происходило, надо отключить "жадность" модификатором "?", вот так:
@postprocess[buffer]
$result[^buffer.match[<parser>(.+?)</parser>][ig]{^process{^^$match.1}}]
Тогда этот match найдет два вхождения шаблона и выполнит код между парными <parser> и </parser>, как и задумывалось.

P.S. Вся эта работа с отложенной обработкой -- одно из решений такой задачи: заголовок страницы хранится в одной из переменных некоего объекта, но кладется он туда в процессе работы с базой данных, условно говоря, "после" того места в коде, где этот заголовок вставляется в код сайта. То есть если его буквально вызвать, то будет пусто (заголовка еще нет). И поэтому мы говорим:
вот здесь надо "в самом конце" (то есть "потом, а не сейчас") вызвать метод, вынимающий эту переменную из объекта -
...
<title><parser>^site.get_page_title[]</parser></title>
...
В процессе обработки кода срабатывает метод
^site.set_page_title[Новость про епрст от 5 марта сего года]
И теперь с помощью нашего match'а в методе @postprocess мы и запускаем метод, вставляющий название страницы в html-код.

P.P.S. Идею по отложенной обработке недавно высказал Misha, это ее я здесь реализовал.

P.P.P.S. Лучше вместо
<parser>какой_то_блин_понимаешь_метод[]</parser>
использовать
<parser какой_то_блин_понимаешь_метод[]>
, так как если что не заматчится, пользователь не увидит непонятных ему слов (имя метода) на экране:
Вы находитесь на странице: какой_то_блин_понимаешь_метод[]
:)

Вот. Может кому пригодится. А может кто возразит чего. Всегда рад буду обсудить.

  • Не жадные регулярные выражения, zDenis 04.03.2003 01:51