Как сделать замену по регулярному выражению?

hivuld

Новичок
Здравствуйте. Я пытаюсь сделать на php свой шаблонизатор, сейчас я делаю цыклы. Вот пример цикла:
[[ @times(5) ]]
<p>{{ $message }}</p>
[[ @times(#end) ]]


Код выше просто выводит {{ $message }} пять раз. И все хорошо, но если использовать вложенные циклы, например:
[[ @times(5) ]]
[[ @times(2) ]]
<p>{{ $message }}</p>
[[ @times(#end) ]]
[[ @times(#end) ]]

то результат будет таким:
[[ @times(5) ]]
Hello world!
Hello world!
[[ @times(#end) ]]

Как сделать чтобы внутренний цикл срабатывал нормально?

Я использую следующий код обработки таких конструкций:
public static function dirs($code, $data) {
$pattern = '/\[\[\s*@([^\(]+)\(([^\)]+)\)\s*\]\]([^\[]+)\[\[\s*@([^\(]+)\(#end\)\s*\]\]/i';
return preg_replace_callback($pattern, function($value) use($data) {
if($value[1] == 'times') return str_repeat($value[3], $value[2]); // $value[3] - строка <p>{{ $message }}</p>, $value[2] = 5;
}, $expression);
}

Тут я просто ищу все конструкии такого вида [[ @times(n) ]] Some text... [[ @times(#end) ]], и вывожу их n раз
Как сделать чтобы внутренний цикл срабатывал нормально?

UPD: Переменная $message равна "Hello world!"
 

AnrDaemon

Продвинутый новичок
Такие вещи, как и любой парсинг в общем случае, регэкспами не решаются.
А решаются написанием своего нормального парсера, либо использованием существующего.
И вообще, почему свой шаблонизатор?
Чем вас не устраивают Twig, Blade, Smarty ?

P.S.
Про убогость синтаксиса вообще молчу.
 
Сверху