Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: PCRE логика для if/else if

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Нужна помощь с регулярными выражениями
TiTanium
Отправлено: 16 Июля, 2009 - 00:46:41
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




Есть свой шаблонизатор все работает отлично, но проблема постоянно возникает с логикой IF/ELSE, причина понятна слабовато знаю PCRE. Я использую вот такое выражение для поиска тегов типа <if name="var">$VAR = TRUE</if>, есть ещё вариант <if name="var">$VAR = TRUE</else>$VAR = FALSE</if>. Сами по себе они работаю, но вот если начитаются вложения типа:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <if name="var">
  3.   <if name="var2"> </else> </if>
  4. </if>  
  5.  

То начинаются и проблемы, при полной жадности он кушает: <if name="var"><if name="var2"> </else> </if> что понятно. вот выражение:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. |<if name="'.$var.'">(.*)</if>|sim
  3.  


При ограниченной типа:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <if name="'.$var.'">(.*?)</if>.|sim
  3.  

тоже проблемы нельзя что б за </if> что-то стояло.
вот еше для if/else:
CODE (text):
скопировать код в буфер обмена
  1.  
  2.   |<if name="'.$var.'">(.*?)</else>(.*?)</if>|sim
  3.  

На данный момент решаю проблему парся два раза в зависимости есть ли в квантификаторах: <if name="

Вот код метода:

CODE (text):
скопировать код в буфер обмена
  1.  
  2. /**
  3.  *  ПАРСИНГ <if name="">*</if>
  4.  * */
  5. protected function if_($var, $value=false){
  6.   if(!preg_match('|<if name="'.$var.'">(.*?)</if>.|sim', $this->CONTENT, $result) or stristr($result[1],'</else>')){ $result =false; }
  7.  
  8.   if($result and stristr($result[1],'<if name="')){
  9.     if(!preg_match('|<if name="'.$var.'">(.*)</if>.|sim', $this->CONTENT, $result) ){ $result =false; }
  10.   }
  11.   if($result and !empty($result)){
  12.     if($value){  
  13.       $this->put(str_replace($result[0],$result[1],$this->CONTENT));
  14.     }else{
  15.       $this->put(str_replace($result[0],'',$this->CONTENT));   
  16.     }
  17.   }                    
  18. }
  19.  

И даже так частенько происходят накладки с вложениями условиями ((
Хотелось бы как-то сделать один нормальный PCRE шаблон чтобы отбрасывать такие ситуации. Может кто сталкивался или видел в каком-то шаблонизаторе нормальное выражение.
 
 Top
valenok
Отправлено: 29 Июля, 2009 - 22:18:12
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Тут сложность возникает в первую очередь от того, что нельзя определить какой if к чему относится.

<if>
<if2>
<else>
<if3>
<else>
<else>
</if>
</if>
</if>


Одними регулярными выражениями тут не обойтись. Нужно искать вхождения всех элементов, как-то их с собой сопоставлять и потом уже обрабатывать. В данном случае очень пригодились бы какие нибудь скобочки, чтоб определять что к чему относится.
Можете посмотреть в исходниках php как интерпретатор обрабатывает такие конструкции в самом php.
Можете перейти на smarty. Или вообще стараться избегать условий в шаблонах, особенно вложенных.


-----
Truly yours, Sasha.
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB