用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4096|回复: 5
收起左侧

[视图] 问一个Loader.php的问题

[复制链接]
发表于 2010-7-27 16:47:57 | 显示全部楼层 |阅读模式
版本ci 1.7.2
Loader.php 673行
这个函数的功能是读取view模板

echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));


file_get_contents($_ci_path)这个取文件,能理解
str_replace('<?=', '<?php echo ',............这个替换php标签
preg_replace("/;*\s*\?>/", "; ?>", ....................这个也是替换php标签
eval('?>'.................eval我知道,但是前面的'?>'.这个不是很理解,为什么要在前面加上这个东西?
请教高手
发表于 2010-7-27 18:56:48 | 显示全部楼层
eval(code_str ) 的参数不能含有php开始的标记<?或者<?php,所以先添加?>,将?>以后的字符按原样输出
发表于 2010-7-28 00:28:57 | 显示全部楼层
经过我的测试 eval 就是直接在输入的字符串上加上 <?php
所以你如果在 eval 的参数里加上 <?php 就报错了。
但是你如果用 ?> 结束,则后面的原样输出,再加上 <?php 就不会报错了,呵呵
 楼主| 发表于 2010-7-29 15:09:37 | 显示全部楼层
PHP复制代码
$pageinfo = addslashes(file_get_contents('mk_templates/data_new.htm'));
eval("\$pageinfo = \"$pageinfo\";");
 
$pageinfo = stripslashes($pageinfo);
 
create_html($fname.'/asc'.$sort_v, $pageinfo);//order asc
复制代码
我看到别的eval读模板的代码是这样的。
这里ci是在前面加了?>,这个方法我也再去试试。
 楼主| 发表于 2010-7-29 15:18:12 | 显示全部楼层
谢谢ls两位,我测试了下,好像加个?>,就直接输出后面的内容了。
但是如果在?>前面再加东西,有些输出正常,有些输出不正常。比如:
eval('as?>123123123');//报错
eval('ds?>123123123');//ok,输出?>后面的内容
发表于 2010-7-29 17:05:47 | 显示全部楼层
呵呵,这都没在 PHP 手册里说明过,所以了解就好了,不用太深入理解。
如果想深入理解,只能是看 PHP 源码了,呵呵

本版积分规则