PHP.SU

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

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

> Найдено сообщений: 1
TiTanium Отправлено: 16 Июля, 2009 - 00:46:41 • Тема: PCRE логика для if/else if • Форум: Регулярные выражения

Ответов: 1
Просмотров: 207
Есть свой шаблонизатор все работает отлично, но проблема постоянно возникает с логикой 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 шаблон чтобы отбрасывать такие ситуации. Может кто сталкивался или видел в каком-то шаблонизаторе нормальное выражение.

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB