3

比如说,我如何在我自己的模板类版本中解析{if $var > 2}{if $var}在 .tpl 文件中进行解析。我不想使用 smarty,因为我不需要他们所有的插件。我只想包含、if、for 和foreach语句。

4

6 回答 6

13

请使用 php。只需放入您的 tpl 文件:

<?php if ($var > 2) .... ?> 

比用php解析文件简单多了,代码少了很多,速度也快了很多

于 2011-02-09T13:35:02.263 回答
9

利用

<? if( condition ) :
    ....
    ....
else : 
    ....
    ....
endif; ?>

if () { } 和 if () 的区别:endif;

于 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 回答