質問
HTML&を含む文字列がありますその中のPHPは、データベースから文字列をプルすると、画面にエコーされますが、PHPコードは表示されません。文字列は次のようになります。
$string = 'Hello <?php echo 'World';?>';
echo $string;
出力
Hello
ソースコード
Hello <?php echo 'World';?>
ソースコードを見ると、そこにphp行があります。したがって、私がする必要があるのは、文字列内のphpセグメントだけをeval()することです。
考慮すべきことの1つは、PHPはいつでも文字列のどこにでも配置できるということです。
*明確にするために、私のPHP設定は正しいです。これは、PHPがデータベースにダンプされてレンダリングされない場合です。走る。 *
お問い合わせいただきありがとうございます。
解決
$str = "Hello
<?php echo 'World';?>";
$matches = array();
preg_match('/<\?php (.+) \?>/x', $str, $matches);
eval($matches[1]);
これは機能しますが、他の人が持っている、そして示唆するように、これはひどい考えです。アプリケーションアーキテクチャは、コードをデータベースに保存することを中心にしないでください。
最も単純なのは、常に文字列を表示する必要があるページがある場合、それらを生成するコードではなく、データベースにそれらの文字列を保存することです。実世界のデータはこれよりも複雑ですが、データベースで常に適切にモデル化する必要があります。
編集:ソース/補間を正しく削除するには、preg_replace_callbackで適応する必要があります。
他のヒント
PHPコードを評価するのではなく、実行するだけです。 PHPインタープリターをインストールし、apache + phpを適切に構成する必要があります。次に、この.phpファイルはHello Worldを出力するはずです。
編集への回答: preg_replace_callbackを使用してphp部分を取得し、評価し、入力を出力に置き換えてからエコーします。 しかし。データベースから評価する必要がある場合は、ほぼ間違いなく、それは設計エラーです。
eval()は、コードが適切なPHPであり、セミコロンで終わる限り、正常に動作するはずです。最初にphpタグを削除してから、評価します。
次の例はテスト済みで動作します:
<?php
$db_result = "<?php echo 'World';?>";
$stripped_code = str_replace('?>', '', str_replace('<?php', '', $db_result));
eval($stripped_code);
?>
基本的にdbにコンテンツを取得できる人なら誰でもコードの実行を許可しているため、dbから取得するものはすべて適切にサニタイズされていることを確認してください。