嘿。我需要一点帮助来增强我的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));
}
答案 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