Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Execute PHP code in a string [duplicate]

Tags:

php

eval

I have my page contents saved in a database and would like to execute any php code in the string. So if my string was:

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

I only want to execute echo $motto. Using eval() will try to execute <h1>Welcome</h1>.

Any way to do this?

like image 217
bmandesign Avatar asked Jun 02 '12 22:06

bmandesign


3 Answers

To echo string with a variable inside use:

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

Or even:

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

Here is a demo http://codepad.org/f6aALD6w

like image 134
PassTeT Avatar answered Nov 15 '22 20:11

PassTeT


Needless to say you should find another solution ASAP. In the meantime you can eval the code like this:

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

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

Demo: http://codepad.org/ao2PPHN7

I can't stress that enough: eval is dangerous, and application code shouldn't be in the database. Try a template parser like Smarty, Dwoo, or my favorite: Twig.

like image 19
Wesley Murch Avatar answered Nov 15 '22 20:11

Wesley Murch


You really shouldn't do this, but if you absolutely have to, you can do it by using this class:

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);
    }
}

Call it like this:

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

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

like image 2
Jeroen Avatar answered Nov 15 '22 20:11

Jeroen