我如何在我自己的模板类版本的.tpl文件中解析{if $var > 2}
或{if $var}
。我不想使用smarty,因为我不需要他们所有的插件。我只想要包含,if,for和foreach
语句。
答案 0 :(得分:13)
请使用php。 只需输入你的tpl文件:
<?php if ($var > 2) .... ?>
这比在php中解析文件要简单得多,代码少,速度快得多。
答案 1 :(得分:7)
使用
<? if( condition ) :
....
....
else :
....
....
endif; ?>
答案 2 :(得分:6)
您已经得到了上一个问题的答案:if statements in php templates using tpl
但是,既然你不会消失,那么让我快速回答它,然后再提一下下一个绊脚石。
// handle {if}...{/if} blocks
$content =
preg_replace_callback('#\{if\s(.+?)}(.+?)\{/if}#s', "tmpl_if", $content);
function tmpl_if ($match) {
list($uu, $if, $inner_content) = $match;
// eval for the lazy!
$if = create_function("", "extract(\$GLOBALS['tvars']); return ($if);");
// a real templating engine would chain to other/central handlers
if ( $if() ) {
return $inner_content;
}
# else return empty content
}
使用这样的正则表达式会跳过嵌套的if
。但你没有问过这个,所以我不会提到它。并且如评论中所述,您实际上需要链接到中央函数,该函数执行进一步替换({foreach}
/ {include}
/等),而不仅仅是return $content
。
这是可行的,但很快变得繁琐。这就是为什么所有其他模板引擎(您拒绝检出)实际上将.tpl
文件转换为.php
脚本的原因。这更容易,因为PHP已经可以处理您尝试使用您自己的模板类来模仿的所有控制结构。
答案 3 :(得分:5)
实际上它非常简单,除非您需要嵌套if条件。
$template = '<b>{foo}</b>{if bar} lorem ipsum {bar}{/if}....';
$markers = array(
'foo' => 'hello',
'bar' => 'dolor sit amet',
);
// 1. replace all markers
foreach($markers as $marker => $value)
$template = str_replace('{'. $marker .'}', $value, $template);
//2. process if conditions
$template = preg_replace_callback('#\{if\s(.+?)}(.+?)\{/if}#s', function($matches) use ($markers) {
list($condition, $variable, $content) = $matches;
if(isset($markers[$variable]) && $markers[$variable]) {
// if the variable exists in the markers and is "truthy", return the content
return $content;
}
}, $template);
答案 4 :(得分:0)
您可以在模板文件(.tpl)。,
中使用以下格式{if $url == 'error'}
Error message Invalid Login!
{/if}