比如说,我如何在我自己的模板类版本中解析{if $var > 2}
或{if $var}
在 .tpl 文件中进行解析。我不想使用 smarty,因为我不需要他们所有的插件。我只想包含、if、for 和foreach
语句。
问问题
13660 次
6 回答
13
请使用 php。只需放入您的 tpl 文件:
<?php if ($var > 2) .... ?>
比用php解析文件简单多了,代码少了很多,速度也快了很多
于 2011-02-09T13:35:02.263 回答
9
于 2011-02-17T04:43:48.823 回答
6
你已经得到了你最后一个问题的答案:使用 tpl 的 php 模板中的 if 语句
但是因为否则你不会离开,让我快速回答它,然后提到哪些将是你的下一个绊脚石。
// 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 已经可以处理您尝试使用自己的模板类模仿的所有控制结构。
于 2011-02-16T22:35:59.873 回答
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);
于 2015-02-03T09:28:46.830 回答
0
您可以在模板文件 (.tpl) 中使用以下格式。,
{if $url == 'error'}
Error message Invalid Login!
{/if}
于 2011-02-23T12:20:16.453 回答
0
有一个 php 代码示例可以解析以下模板(php 5.3+):
[IF {post_content}]Post content is filled![ENDIF]
[IF {post_content}]Post content is filled![ELSE]{post_content}[ENDIF]
代码:
$tags = array('post_content'=>'POST_CONTENT');
$message = '1: [IF {post_content}]Post content: {post_content}![ENDIF]
2: [IF {post_content}]Post content is filled![ELSE]Post content is empty![ENDIF]';
$matches = array();
preg_match_all('/\[IF \{([^\}]*)\}\](.[^\]]+)(?:\[ELSE\](.+?))?\[ENDIF\]/s', $message, $matches);
if ( empty($matches) ) {
return $message;
}
$math_tag = '';
foreach ( $matches[0] as $m_index => $match )
{
$math_tag = trim($matches[1][$m_index]);
if ( !empty($tags[$math_tag]) ) {
// IF value is not empty
$message = str_replace($match, $matches[2][$m_index], $message);
} elseif( empty($tags[$math_tag]) && $matches[3][$m_index] ) {
// ELSE
$message = str_replace($match, $matches[3][$m_index], $message);
} else {
// IF NO ELSE condition - REMOVE ALL
$message = str_replace($match, '', $message);
}
}
foreach($tags as $tag => $value)
$message = str_replace('{'. $tag .'}', $value, $message);
echo $message;
于 2017-05-08T08:30:28.260 回答