[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PCRE логика для if/else if
TiTanium
Есть свой шаблонизатор все работает отлично, но проблема постоянно возникает с логикой IF/ELSE, причина понятна слабовато знаю PCRE. Я использую вот такое выражение для поиска тегов типа <if name="var">$VAR = TRUE</if>, есть ещё вариант <if name="var">$VAR = TRUE</else>$VAR = FALSE</if>. Сами по себе они работаю, но вот если начитаются вложения типа:
Код

<if name="var">
 <if name="var2"> </else> </if>
</if>  

То начинаются и проблемы, при полной жадности он кушает: <if name="var"><if name="var2"> </else> </if> что понятно. вот выражение:
Код

|<if name="'.$var.'">(.*)</if>|sim


При ограниченной типа:
Код

<if name="'.$var.'">(.*?)</if>.|sim

тоже проблемы нельзя что б за </if> что-то стояло.
вот еше для if/else:
Код

 |<if name="'.$var.'">(.*?)</else>(.*?)</if>|sim

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

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

Код

/**
*  ПАРСИНГ <if name="">*</if>
* */
protected function if_($var, $value=false){
 if(!preg_match('|<if name="'.$var.'">(.*?)</if>.|sim', $this->CONTENT, $result) or stristr($result[1],'</else>')){ $result =false; }

 if($result and stristr($result[1],'<if name="')){
   if(!preg_match('|<if name="'.$var.'">(.*)</if>.|sim', $this->CONTENT, $result) ){ $result =false; }
 }
 if($result and !empty($result)){
   if($value){  
     $this->put(str_replace($result[0],$result[1],$this->CONTENT));
   }else{
     $this->put(str_replace($result[0],'',$this->CONTENT));
   }
 }                
}

И даже так частенько происходят накладки с вложениями условиями ((
Хотелось бы как-то сделать один нормальный PCRE шаблон чтобы отбрасывать такие ситуации. Может кто сталкивался или видел в каком-то шаблонизаторе нормальное выражение.

Пожалуйста не рекомендуйте свои шаблонизаторы, вопрос состоит не в том какой шаблонизатор выбрать. Приму и не проверенные регулярки сам проверю.



Спустя 13 часов, 7 минут, 47 секунд (16.07.2009 - 14:24) Alchemist написал(а):
попробуй этот шаблон, но предупреждаю сразу - на больших текстах может работать довольно долго...

Код
/<if name="'.$var.'">(((?>[^<>]+)|<\/else>|(<if[^<]+>((?>[^<>]+)|<\/else>|(?R))*<\/if>))*)<\/if>/is

Спустя 18 часов, 57 минут, 35 секунд (17.07.2009 - 09:22) TiTanium написал(а):
Alchemist
Тут вроде как ошибка (?R) скорее все должно быть так (?>R) ?

Спустя 7 часов, 16 минут, 40 секунд (17.07.2009 - 16:39) Alchemist написал(а):
нет

но ошибка (не критичная) есть. (>?[^<>]+) должно быть заменено на (?>[^<>]+)

я исправил шаблон в предыдущем посте

Спустя 4 часа, 2 минуты, 17 секунд (17.07.2009 - 20:41) TiTanium написал(а):
Спасибо
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.