web-dev-qa-db-ja.com

文字列でPHPコードを実行する

ページのコンテンツをデータベースに保存していて、文字列内のphpコードを実行したいと思います。したがって、私の文字列が次の場合:

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

echo $mottoだけを実行したい。 eval()を使用すると、<h1>Welcome</h1>を実行しようとします。

これを行う方法はありますか?

8
bmandesign

言うまでもなく、できるだけ早く別の解決策を見つける必要があります。それまでの間、次のようにコードを評価できます。

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

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

デモ: http://codepad.org/ao2PPHN7

十分に強調することはできません。evalは危険であり、アプリケーションコードをデータベースに含めるべきではありません。 SmartyDwoo 、または私のお気に入り: Twig のようなテンプレートパーサーを試してください。

16
Wesley Murch

あなたreallyはこれを行うべきではありませんが、どうしても必要な場合は、次のクラスを使用して行うことができます。

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
Jeroen

使用中に変数を使用して文字列をエコーするには:

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

あるいは:

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

これがデモです http://codepad.org/f6aALD6w

0
PassTeT