|
|
|
| Всем добрый вечер! Я пишу шаблонизатор для своего движка. И столкнулся с такой проблемкой: не могу понять алгоритм и состовить рег. выра. Подтолкните меня немного.
Вот я примерно испльзую такой вид условия в своем шаблонизаторе:
{if *}
{elseif *}
{else}
{endif}
где * там условия. Но есть еше один момент {elseif *} может быть много.
И как это сдделать я не знаю. Подскажите пожайлуста.
Всем Заранее Спасибо!! | |
|
|
|
|
|
|
|
для: Staglu
(16.01.2008 в 21:54)
| | В несколько приемов. Сначала взять блок if ... endif, а потом разбирать его дальше несколькими регулярными выражениями. Естественно, все вложенные if надо обработать раньше. | |
|
|
|
|
|
|
|
для: Staglu
(16.01.2008 в 21:54)
| | Регулярные выражения в общем случае не работают с иерархическими (древовидными) структурами.
Имеет смысл выбрать более подходящий инструмент. | |
|
|
|
|
|
|
|
для: Staglu
(16.01.2008 в 21:54)
| | Спасибо! | |
|
|
|
|
|
|
|
для: Staglu
(18.01.2008 в 19:46)
| | Ну вот я вроде извлекаю блок if, а потом пытаюсь разложить его на elseif если такие имеются.
Извлекаю блок я с помошью вот такого рег.выраж:
<?php
preg_match_all("/{[\\s]*if[\\s](.*)[\\s]*}[\\s]*([\\w\\W]*?)[\\s]*{else}[\\s]*([\\w\\W]*?)[\\s]*{[\\s]*\/endif[\\s]*}/i", $bufer, $if);
?>
|
$bufer = это та переменная в которую мы считали тело шаблона.
Теперь вот:
<?php
if(count($if))//Обработка условий
{
for($x=0; $x != count($if[1]);$x++)
{
//ВОТ ПРОБЛЕММА В ЭТОЙ РЕГУЛЯРКИ =>
preg_match_all("|{[\\s]*elseif[\\s]*(.*)[\\s]*}[\\s]*([\\w\\W].*)[\\s]*|i", $if[2][$x], $elseif);
if(count($elseif))
{
for($o = 0; $o != count($elseif[1]);$o++)
{
/* Ну здесь я думаю понятно что будет происходить*/
}
}
$bufer = str_replace($if[0][$x], "", $bufer);
}
}
?>
|
К примеру вот блок:
{if fdgjfdjkgdjk}
00.....00000
{elseif fddsffd}
fjgkhdfjkghjkdf
fdghdfj32khgjdfg
{elseif jfdfdj}
0000011
{else}
gfhnjfgkhjfgkh
{/endif}
И я немогу извлечь куски elseif с помошью этой регулярки: preg_match_all("|{[\\s]*elseif[\\s]*(.*)[\\s]*}[\\s]*([\\w\\W].*)[\\s]*|i", $if[2][$x], $elseif);
Какая нужна регулярка, чтобы извлечь из elseif условие и то, что за ним следует до elseif или else
P.S УХ!! Вроде объяснил, но если не понятно пишите буду пытаться понятней свою проблемму высказать. | |
|
|
|
|
|
|
|
для: staglu
(21.01.2008 в 20:47)
| |
{[\s]*elseif[\s]*([^\}]*)[\s]*}[\s]*([\w\W].*?)(\{else|$)
|
Что-то типа этого, как мне кажется. | |
|
|
|
|
|
|
|
для: Loki
(22.01.2008 в 10:23)
| | Попробовал, но эта гегулярка что-то тоже не хочет извлекать. Вроде я ее покрутил, немного изменил, но увы, может есть какой-то эквивалент этой регулярки. | |
|
|
|
|
|
|
|
для: Staglu
(23.01.2008 в 20:00)
| | а пример шаблона можно? | |
|
|
|
|
|
|
|
для: Loki
(24.01.2008 в 09:48)
| | Ну вот пример | |
|
|
|
|
|
|
|
для: Staglu
(24.01.2008 в 18:03)
| | У меня получилась вот такая конструкция
<?
$tpl="
00.....00000
{elseif fddsffd}
fjgkhdfjkghjkdf
fdghdfj32khgjdfg
{elseif jfdfdj}
0000011
{else}
gfhnjfgkhjfgkh
";
preg_match_all('#\{elseif[\s]+([^\}]*)\}(.*)(?=\{else)#Uis', $tpl, $arr, PREG_SET_ORDER);
echo "<pre>";
print_r($arr);
?>
|
| |
|
|
|
|
|
|
|
для: Loki
(25.01.2008 в 16:56)
| | Большое Cпасибо !!! | |
|
|
|