Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Регул. выр. для шаблонизатора {if} {elseif} {else} {endif}
 
 автор: Staglu   (16.01.2008 в 21:54)   письмо автору
 
 

Всем добрый вечер! Я пишу шаблонизатор для своего движка. И столкнулся с такой проблемкой: не могу понять алгоритм и состовить рег. выра. Подтолкните меня немного.
Вот я примерно испльзую такой вид условия в своем шаблонизаторе:
{if *}

{elseif *}

{else}

{endif}

где * там условия. Но есть еше один момент {elseif *} может быть много.
И как это сдделать я не знаю. Подскажите пожайлуста.
Всем Заранее Спасибо!!

   
 
 автор: Loki   (17.01.2008 в 11:15)   письмо автору
 
   для: Staglu   (16.01.2008 в 21:54)
 

В несколько приемов. Сначала взять блок if ... endif, а потом разбирать его дальше несколькими регулярными выражениями. Естественно, все вложенные if надо обработать раньше.

   
 
 автор: Trianon   (17.01.2008 в 23:52)   письмо автору
 
   для: Staglu   (16.01.2008 в 21:54)
 

Регулярные выражения в общем случае не работают с иерархическими (древовидными) структурами.
Имеет смысл выбрать более подходящий инструмент.

   
 
 автор: Staglu   (18.01.2008 в 19:46)   письмо автору
 
   для: Staglu   (16.01.2008 в 21:54)
 

Спасибо!

   
 
 автор: staglu   (21.01.2008 в 20:47)   письмо автору
 
   для: 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 УХ!! Вроде объяснил, но если не понятно пишите буду пытаться понятней свою проблемму высказать.

   
 
 автор: Loki   (22.01.2008 в 10:23)   письмо автору
 
   для: staglu   (21.01.2008 в 20:47)
 


{[\s]*elseif[\s]*([^\}]*)[\s]*}[\s]*([\w\W].*?)(\{else|$)

Что-то типа этого, как мне кажется.

   
 
 автор: Staglu   (23.01.2008 в 20:00)   письмо автору
 
   для: Loki   (22.01.2008 в 10:23)
 

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

   
 
 автор: Loki   (24.01.2008 в 09:48)   письмо автору
 
   для: Staglu   (23.01.2008 в 20:00)
 

а пример шаблона можно?

   
 
 автор: Staglu   (24.01.2008 в 18:03)   письмо автору
 
   для: Loki   (24.01.2008 в 09:48)
 

Ну вот пример

   
 
 автор: Loki   (25.01.2008 в 16:56)   письмо автору
 
   для: 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$arrPREG_SET_ORDER);
echo 
"<pre>";
print_r($arr);
?>

   
 
 автор: Staglu   (28.01.2008 в 00:08)   письмо автору
 
   для: Loki   (25.01.2008 в 16:56)
 

Большое Cпасибо !!!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования