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
Форумы портала PHP.SU :: Версия для печати :: PCRE логика для if/else if
Форумы портала PHP.SU » PHP » Регулярные выражения » PCRE логика для if/else if

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

1. TiTanium - 16 Июля, 2009 - 00:46:41 - перейти к сообщению
Есть свой шаблонизатор все работает отлично, но проблема постоянно возникает с логикой 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 шаблон чтобы отбрасывать такие ситуации. Может кто сталкивался или видел в каком-то шаблонизаторе нормальное выражение.
2. valenok - 29 Июля, 2009 - 22:18:12 - перейти к сообщению
Тут сложность возникает в первую очередь от того, что нельзя определить какой if к чему относится.

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


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

 

Powered by ExBB FM 1.0 RC1