TPL自定义模版如可处理if语句内变量不存在报错问题!

在TPL自定义模版的学习中,我发现如下问题

如果TPL模版里面写入的有IF语句我们一般格式如下:

代码:

{if $add}
<form action="level.php?action=add" method="post" class="add" name="add">
<p>等级名称:<input type="text" name="level_name" class="text"/></p>
<p>等级信息:</p>
<textarea name="level_info" cols="30" rows="10" ></textarea>
<p><button type="submit" name="submit" value="add" onclick="return checkFrom()">新增等级</button> [ <a href="level.php?action=show">返回列表</a> ]</p>
</form>
{/if}

如果条件为真,下面的代码执行,如果不存在,就是假,那就隐藏

但是当我解析过IF语句的时候,发现变量不存在就会报错,错误没有发现add参数

解析匹配结构如下:
//解析if语句
/*
* 理解php的if语句
* if(xxx){
*
* }else{
*
* }
* ******
* 在tpl文件内的格式
* {if $a}
*{else}
*
* {/if}
*对照上面的我们进行匹配
*/

错误代码:
private function parIf(){
$pattenIf = '/\{if\s+\$([\w]+)\}/';
$pattenEndIf = '/\{\/if\}/';
$pattenElse = '/\{else\}/';
if (preg_match($pattenIf,$this->tpl)) {
if (preg_match($pattenEndIf,$this->tpl)) {
$this->tpl = preg_replace($pattenIf,"<?php if (\$this->vars['$1']) {?>",$this->tpl);
                                  //这里无@符号
$this->tpl = preg_replace($pattenEndIf,"<?php } ?>",$this->tpl);
if (preg_match($pattenElse,$this->tpl)) {
$this->tpl = preg_replace($pattenElse,"<?php } else { ?>",$this->tpl);
}
} else {
exit('ERROR:if语句没有关闭!');
}
}

}

后来通过仔细观察发现在匹配过程中,我们并没有把错误给抑制了,所以需要在替换的时候加上@符号,这样才能抑制错误

正确代码:
private function parIf(){
$pattenIf = '/\{if\s+\$([\w]+)\}/';
$pattenEndIf = '/\{\/if\}/';
$pattenElse = '/\{else\}/';
if (preg_match($pattenIf,$this->tpl)) {
if (preg_match($pattenEndIf,$this->tpl)) {
$this->tpl = preg_replace($pattenIf,"<?php if (@\$this->vars['$1']) {?>",$this->tpl);
                                  //@符号处
$this->tpl = preg_replace($pattenEndIf,"<?php } ?>",$this->tpl);
if (preg_match($pattenElse,$this->tpl)) {
$this->tpl = preg_replace($pattenElse,"<?php } else { ?>",$this->tpl);
}
} else {
exit('ERROR:if语句没有关闭!');
}
}

}




posted @ 2016-02-01 01:24  兰小宇  阅读(434)  评论(0编辑  收藏  举报