在字符串中执行PHP代码

时间:2012-06-02 22:06:47

标签: php eval

我将我的页面内容保存在数据库中,并希望在字符串中执行任何php代码。所以,如果我的字符串是:

<h1>Welcome</h1><?php echo $motto?><br/>

我只想执行echo $motto。使用eval()将尝试执行<h1>Welcome</h1>

有什么办法吗?

3 个答案:

答案 0 :(得分:16)

毋庸置疑,您应该尽快找到另一种解决方案。在此期间,您可以像这样评估代码:

$str = '<h1>Welcome</h1><?php echo $motto?><br/>'; // Your DB content

eval("?> $str <?php ");

演示:http://codepad.org/ao2PPHN7

我不能强调这一点:eval很危险,应用程序代码不应该在数据库中。尝试使用SmartyDwoo或我最喜欢的Twig模板解析器。

答案 1 :(得分:2)

真的不应该这样做,但如果你绝对必须这样做,你可以使用这个类来做到这一点:

class PhpStringParser
{
    protected $variables;

    public function __construct($variables = array())
    {
        $this->variables = $variables;
    }

    protected function eval_block($matches)
    {
        if( is_array($this->variables) && count($this->variables) )
        {
            foreach($this->variables as $var_name => $var_value)
            {
                $$var_name = $var_value;
            }
        }

        $eval_end = '';

        if( $matches[1] == '<?=' || $matches[1] == '<?php=' )
        {
            if( $matches[2][count($matches[2]-1)] !== ';' )
            {
                $eval_end = ';';
            }
        }

        $return_block = '';

        eval('$return_block = ' . $matches[2] . $eval_end);

        return $return_block;
    }

    public function parse($string)
    {
        return preg_replace_callback('/(\<\?=|\<\?php=|\<\?php)(.*?)\?\>/', array(&$this, 'eval_block'), $string);
    }
}

这样称呼:

$p = new PhpStringParser();
echo $p->parse($string);

来源:http://www.php.net/manual/en/function.eval.php#108091

答案 2 :(得分:0)

使用内部变量回显字符串:

echo "<h1>Welcome</h1>$motto<br/>"

甚至:

echo sprintf('<h1>Welcome</h1>%s<br/>', $motto)

以下是演示http://codepad.org/f6aALD6w