TiTanium
16.07.2009 - 02:16
Есть свой шаблонизатор все работает отлично, но проблема постоянно возникает с логикой 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 написал(а):