условные операраторы в шаблонах

clevel

Новичок
условные операторы в шаблонах

1.Поиск по данному вопросу дергал.
2.Необходимо в своей системе шаблонов ввести возможность задавать условия вида:
IF[condition]{}ELSE{another}, приче ELSE{} является не обязательной частью.
сделал регулярное выражение:
PHP:
$shab=preg_replace_callback("/IF\s*\[([^]]*)\]\s*\{([^}]*)\}\s*(ELSE\{([^}]*)\}|)/sim","remove_if",$shab);
3.собственно проблема: надо корректно отрабатывать условные операторы, если есть подшаблоны.
strtok смотрел, не устраивает, так как при задании условия для рабивки слов IF[0>0]{cccIF[1>1]{nnn}}ELSE{ddd} начинает игнорировать символы IFELSE в шаблоне, что не допустимо.
Подскажите, куда смотреть?
Заранее спасибо!

-~{}~ 23.06.04 08:55:

решение пришло само, как снежный ком на голову..
PHP:
   while(($pos=strrpos($shab,"IF"))!==false){
    $shab=substr($shab,0,$pos).preg_replace_callback("/IF\s*\[([^]]*)\]\s*\{(.*?)\}\s*(ELSE\s*\{(.*?)\}|)/sim","remove_if",substr($shab,$pos));
   }  //while have conditions
П.С.: в последнее время участились случаи самовольного обнаружения решения проблем... :)
Спасибо всем за участие..

-~{}~ 23.06.04 09:30:

так.. столкнулся по ходу с такой проблемкой... у меня функция remove_if в качестве параметра получает массив $match, где $match[1] "чистенькое" условие IF[]..
так вот, простое
PHP:
$tmpl=($match[1]) ? ($match[2]) : ($match[4]);
всегда дает истину, что по документации правильно...
однако хочется получать истину/ложь исходя из содержания строки. eval использовать крайне не хочется..
Есть ли решения данной проблемы?
Условия вида 0>0, 'ab'!=''

-~{}~ 23.06.04 11:28:

сделал самописную функцию, вроде работает. Критика приветствуется:
PHP:
  function parse_condition($val){
   preg_match("/([^><!=]*?)([><!=]{1,2})(.*)/is",$val,$res);
   switch($res[2]){
    case ">":  return ($res[1]> $res[3]) ? (true): (false);
    case ">=": return ($res[1]>=$res[3]) ? (true): (false);
    case "<":  return ($res[1]< $res[3]) ? (true): (false);
    case "<=": return ($res[1]<=$res[3]) ? (true): (false);
    case "==": return ($res[1]==$res[3]) ? (true): (false);
    case "!=": return ($res[1]!=$res[3]) ? (true): (false);
    default:   return false;
   } //switch operand
  }  //function parse_condition
-~{}~ 23.06.04 11:28:

какое продуктивное общение получилось.. сам с собой.. :)
 
Сверху