简单的if / else解析器用于模板引擎

时间:2011-05-14 10:34:11

标签: php

嘿。我需要一点帮助来增强我的IF / ELSE解析器(对于一个简单的模板引擎)。 现在我可以使用:

{if:something=value}Some info{/if}

{if:something=value}Some info{if:somethingelse=value}even more info{/if}{/if}

{if:something=value}Some info{%else%}Some other info{/if}

当我必须写一些更复杂的东西时,问题就开始了,例如:

{if:something=value}
 {if:somethingelse=value}Some info{%else%}Some other info{/if}
{%else%}
 Totally different info
{/if}

IF-s按原样递归解析,但由于我使用一个简单的“爆炸”来找到“else”值,它只返回第一个%else%(DoItDifferently)if something = false。 / p>

我的代码atm:

function parseIfs($input) {
    $regex = '#\{if\:?"?(.*?)"?\}((?:[^{]|\{(?!/?if\:?"?(.*?)"?\})|(?R))+)\{/if\}#i'; 
    if(is_array($input)) {
        // IF - value (defaults to "true" if not defined)
        $block = explode('=',$input[1]); if(empty($block[1])) $block[1] = true;
        // Explode if:value 
        $condition = explode(':',str_replace('!','',$block[0])); 
        // Get the problematic "else" value
        $outcome = explode('{%else%}',$input[2]);
        global ${$condition[0]};
        // Value to check against (can handle arrays - something:something1:something2 => $something[something1][something2])
        $replacement = ${$condition[0]}; for($i = 1; $i < count($condition); $i++) $replacement = $replacement[$condition[$i]];
        if(!strpos($block[0],'!') ? $replacement == $block[1] : $replacement != $block[1])
            $input = $outcome[0];
        else 
            $input = !empty($outcome[1]) ? $outcome[1] : '';
    }
    return trim(preg_replace_callback($regex, 'parseIfs', $input));
}

2 个答案:

答案 0 :(得分:2)

这不是你的问题的确切答案(我的意思是函数的问题),但这是你可能考虑使用的另一个解决方案(这样你应该使用PHP的条件运算符,如==,=== ,! =等等,但如果你愿意,你可以添加额外的代码来覆盖它。

function parse($code){
    $code = str_replace('{%else%}', '<? } else { ?>', $code);
    $code = str_replace('{/if}', '<? } ?>', $code);
    $code = preg_replace('/\{if:(.+?)\}/i', '<? if($1){ ?>', $code);

    eval('?>'.$code.'<?');
}

答案 1 :(得分:0)

我想你会从这里得到更好的帮助

https://ellislab.com/expressionengine/user-guide/templates/conditionals.html