[PHP] Рекурсивное регулярное выражение

12
RiDDi
На сайте с 06.06.2010
Offline
285
#11

Вы не так понимаете смысл рекурсивных шаблонов :)

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

Вашу же задачу решить регулярным выражением невозможно, слишком жирно будет 😂

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

Вебмастер отдыхает на бережках морей. Заработок в интернете - дело техники.
T
На сайте с 19.09.2012
Offline
29
#12

Вытащил из своего шаблонизатора 2002-го года - просто как вариант альтернативного решения при похожей нужде.

Мне требовалось, чтобы при обработке шаблона можно было вставить другой шаблон, в котором бы тоже всё работало как в самостоятельном шаблоне ("рекурсивно"):

function template_get($template, $vars=array())
{
$text = @join('',file(template_filename($template)));
return preg_replace("/{([\w\._@ :\"'=\-\x80-\xFF]+)}/e","template_get_value('\\1',\$vars)",$text);
}

function template_get_value($var, &$vars)
{
...
return $value;
}

Что-то я бы сейчас написал иначе (в частности, UTF-8 там не было в помине), но для примера это не имеет значения (код работал без сбоев 8 лет, пока не проворонили хостинг).

Функция template_get_value($var, &$vars) после обработки возвращала то, что требовалось по логике шаблонизатора в нужных комбинациях (при этом естественно имела право вызвать какую-то функцию рекурсивно, например, вложить другой шаблон). &$vars использовать необязательно. Это были переменные, "глобальные" для данного контекста обработки шаблона (например, там были базовый урл сайта, базовый урл для картинок, и т.д., в т.ч. изменяемые элементы).

Внутри функции уже можно было делать explode() и т.д. Но получается, что изначальная регулярка была только одна.

P.S. фигурные скобки не заэкранированы, т.к. здесь не возникает двусмысленности (т.к. перед возможным квантификатором "{...}" ничего нет).

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий