phpcms模板解析嵌套标签解析失败
PHPCMS的模板解析函数是/phpcms/libs/classes/template_cache.class.php这个类中的template_parse函数.
我把这个文件拿出来,然后在下面直接写上
$str = '{php echo 1} -- {$abc}';
$template = new template_cache();
echo $c = $template->template_parse($str);
这时输出的是
<?phpdefined('IN_PHPCMS')orexit('Nopermissionresources.');?><?phpecho1}--{$abc?>
不出所料,解析出的代码,出现了语法错误,我们 想要的结果应该是
<?phpecho1?>--<?phpecho$abc?>
下面开始找问题,在函数template_parse的第3行,是用来解析php开头的模板语法的
$str=preg_replace("/\{php\s+(.+)\}/","<?php\\1?>",$str);
这里可以看出,解析的方式是找到{php后面所有的内容,直到另一半大括号},这之间的内容,全部放到<?php 和?>之间.
我们上面的例子之所以会出现那个结果,是因为在遇到第一个右大括号}时,没有把它当做结尾,而是继续向后读取.
知道原因后,就容易修改了
在正则中加一个问号?,用来表示非贪婪读取,在读到第一个右大括号时,就结束.
$str=preg_replace("/\{php\s+(.+?)\}/","<?php\\1?>",$str);
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。