У меня проблема с созданием регулярных выражений для моего собственного механизма шаблонов. Мой код:Регулярное выражение для настраиваемого шаблона - вложенность (PHP)
$re_foreachelse = '%
{foreach (.+?) as (.+?)}
(
[^{]*
(?:
{
(?!/?foreach(.*?)})
[^{]*
)*
)
{foreachelse}
(
[^{]*
(?:
{
(?!/?foreach(.*?)})
[^{]*
)*
)
{/foreach}
%x';
$re_foreach = '%
{foreach (.+?) as (.+?)}
(
[^{]*
(?:
{
(?!/?foreach(.*?)})
[^{]*
)*
)
{/foreach}
%x';
while(preg_match($re_foreachelse, $this->tpl)) $this->tpl = preg_replace($re_foreachelse, '[foreach $1 as $2]$3[foreachelse]$4[/foreach]', $this->tpl);
while(preg_match($re_foreach, $this->tpl)) $this->tpl = preg_replace($re_foreach, '[foreach $1 as $2]$3[/foreach]', $this->tpl);
Я буду генерировать код PHP, но для тестирования только изменения «{}» на «[]». Моя проблема в том, что это работает для большинства из вложенных тегов:
[foreach $items as $item] $item [foreach $item as $i] $i [foreachelse][/foreach] $item [foreachelse][/foreach]
{foreach $items as $item} [foreach $tests as $test] [foreach $test as $t] [/foreach] [/foreach] {foreachelse} {/foreach}
[foreach $othertests as $test] [foreach $item as $i] $i [foreachelse][/foreach] [/foreach]
Однако, как вы можете видеть, один не изменяется, и до сих пор «{}». Похоже, что вложение foreach с foreachelse в foreach работает, но не наоборот.
Я просто начинающий в регулярных выражениях, и я действительно не знаю, где проблема. Благодарим вас за любые хорошие идеи.
P.S .: Извините за мой плохой английский.
Выполнение такого рода работы с использованием только регулярного выражения обречено на провал, вы должны использовать синтаксический анализатор lexer +. Мой совет: взгляните на [Twig code] (https://github.com/twigphp/Twig) ([lexer] (https://github.com/twigphp/Twig/blob/master/lib/Twig/Lexer) .php), [парсер] (https://github.com/twigphp/Twig/blob/master/lib/Twig/Parser.php)) – mTorres