在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语句没有关闭!');
}
}
}