function _eval($content)
{
ob_start();
eval('?' . '>' . trim($content));
$content = ob_get_contents();
ob_end_clean(); return $content;
}
请问eval的用法,这样的用法目的何在,谢谢
{
ob_start();
eval('?' . '>' . trim($content));
$content = ob_get_contents();
ob_end_clean(); return $content;
}
请问eval的用法,这样的用法目的何在,谢谢
执行后会输出html,
利用ob_*系列函数,获取$content内容的输出.
<?php
function _eval($content)
{
ob_start();
eval('?' . '>' . trim($content));
$content = ob_get_contents();
ob_end_clean(); return $content;
}
echo _eval('<?php echo "hello world";?>');
?>
function _eval($content)
{
ob_start();
eval('?' . '>' . trim($content)); //这里eval '?'.'>'是要考虑$content里php代码混合html代码的情况,适用于模板
$content = ob_get_contents();
ob_end_clean(); return $content;
}
echo _eval('<input type="text"/><?php echo "hello world";?><input type="text"/>');
?>
$content = 'the name is $name';//这边用单引号和双引号区别很大
eval("\$content = \"$content\";");//这边的作用就是给 $content 重新附值 结果变成了 $content = "the name is $name";
echo $content; //结果就是 the name is abcd;下面代码结果一样:
$name = 'abcd';
$content = "the name is $name";//
echo $content;
对我就是想问这个,还是不明白为什么要加 '?' . '>' .
你的例子非常好
echo _eval('<input type="text"/><?php echo "hello world";?><input type="text"/>');
==========================================
<?php
/**==eval开始==**/?>//这里就是eval里的那个'?'.'>'<input type="text"/>
<?php
echo "hello world"
;?>
<input type="text"/>
/**==eval结束==**/
?>
=====================================假如没有eval '?'.'>'
就解析成
===================================
<?php
/**==eval开始==**/<input type="text"/>
<?php
echo "hello world"
;?>
<input type="text"/>
/**==eval结束==**/
?>
解析错误
-->
</pre>
<?php呢?
最后想加"<?php "和你给出的最后这个"?>"配对,为什么不行啊?
我确实不是太明白
<?php
//这样清晰一点
eval('?><input type="text"/><?php echo "hello world"?><input type="text"/><?php ');//注意最后保留一个空格即可,否则解析成<?php?>就不对了,<?php ?>才正确
?>
<?php
echo eval('?>'.'<?php echo "hello world" ?>'.'<?php ');
?>
这个没有问题,你说这是为什么呢
ob_start到底还有什么内容呢? foolbirdflyfirst ?
<?php
function _eval($content)
{
eval('?' . '>' . $content);
}
_eval('<input type="text"/><?php echo "hello world"?><input type="text"/><?php ');
?>
还有就是我忽略了个问题,由于php.ini内short_open_tag的设置,eval php闭合标签都会出现不同,on的情况可解析短标签<? ?>以及<?php ?>,off的情况只能支持标准的<?php ?>
以上例子改一下
<?php
function _eval($content)
{
eval('?' . '>' . $content);
}
_eval('<input type="text"/><?php echo "hello world"?><input type="text"/><?php');//把最后的空格去掉,php.ini内设置short_open_tag为off,可以发现不同。如果short_open_tag 为on,这一句就会解析错误。
?>
关于原因,只能大胆猜想php的eval实现是不太严谨的.
举个例子,在short_open_tag为on的情况下。
<?php
eval('?><?php');
?>
解析错误 为什么呢?对于eval内部的<?php,因为后面没有空格或者分号,eval就没有把<?php当成一个标签整体,而是首先解析<?短标签,再解析php
验证例子
<?php
function php(){echo 1;}
eval('?><?php();');
?>
输出是1,实际上就是<?php?><? php();?>这么一个解析过程。
倘若是short_open_tag为on的情况,则上例会输出<?php() 因为<?php与()并没有隔开,eval没有把<?php当成个标签整体,所以选择了把<?php()作为个字符串输出。
结论就是
eval(内部出现的<?php出现在字符串最后面时,其后尽量带个空格或者;号);
=====================================================================
倘若是short_open_tag为off的情况,则上例会输出 <?php() 因为 <?php与()并没有隔开,eval没有把 <?php当成个标签整体,所以选择了把 <?php()作为个字符串输出。
==========================================================
结论为:
eval(内部出现的 <?php出现在字符串最后面时,其后尽量带个空格或者;号); short_open_tag为off的情况下
===============================================================
结论为:
eval(内部出现的 <?php出现在字符串最后面时,其后尽量带个空格,如果是分号须与<?php标签隔开); 考虑一下这个简单例子
<?php
eval('?><?php;');
?>