ページのコンテンツをデータベースに保存していて、文字列内のphpコードを実行したいと思います。したがって、私の文字列が次の場合:
<h1>Welcome</h1><?php echo $motto?><br/>
echo $motto
だけを実行したい。 eval()を使用すると、<h1>Welcome</h1>
を実行しようとします。
これを行う方法はありますか?
言うまでもなく、できるだけ早く別の解決策を見つける必要があります。それまでの間、次のようにコードを評価できます。
$str = '<h1>Welcome</h1><?php echo $motto?><br/>'; // Your DB content
eval("?> $str <?php ");
デモ: http://codepad.org/ao2PPHN7
十分に強調することはできません。evalは危険であり、アプリケーションコードをデータベースに含めるべきではありません。 Smarty 、 Dwoo 、または私のお気に入り: Twig のようなテンプレートパーサーを試してください。
あなた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);
使用中に変数を使用して文字列をエコーするには:
echo "<h1>Welcome</h1>$motto<br/>"
あるいは:
echo sprintf('<h1>Welcome</h1>%s<br/>', $motto)
これがデモです http://codepad.org/f6aALD6w