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" οnclick="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语句没有关闭!');
}
}

}




转载于:https://www.cnblogs.com/lanxiaoyu/articles/5174290.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值