HTMLテンプレートを読み込んで出力するシステムをPHP5で作ったのですが、テンプレート内にもPHPコードを埋め込みたいと言う要望をクライアントから出されてどう実現すればいいのかわからずに困っています;
だいたいどの言語も同じような仕様を持っていますが、PHPで文字列をコードとして実行するのは、
eval()になります。
たとえばテンプレートファイルを
sample.tmp
<html> <head> </head> <body> _PHP for( $i=0 ; $i<10 ; $i++ ) echo "Hello World\n<BR>"; </body> </html>
としておいて、
<?php $handle = @fopen("sample.tmp", "r"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle, 4096); if( substr( $buffer, 0, 4 ) == "_PHP" ) { eval( substr( $buffer, 4, -1 ) ); } else { echo $buffer; } } fclose($handle); } ?>
とすれば、テンプレート内で _PHP で始まる行をコードとして処理します。
この結果は"Hello World" が十回画面に表示されます。
いったん ~~~.phpのファイルを作成して、それを実行するようにしたらいかがでしょうか?
ありがとうございます。
そのような処理を考えているのですが、効率的な処理の流れを思い浮かべずに困っています。
<?php echo "'hello world!'" ?>
上記のようにダブルクォーテーションで囲んでもらえば出来るはずですが
この程度の超初心者的な事であればphpでシステムを作って商売になさっておられる方が
相談にこられるとも思いませんので、もっともっと深い部分で躓いておられるのだと思いますが
どのようなシステムで、どのようなテンプレートをお使いになっていて、
ハローワールドの記述はどこで行っていてなどなど、システムについて具体的に書けませんか?
ありがとうございます。
説明不足で恐れ入ります。
下記、MookさんのようなテンプレートをPHPが読み込む際にPHP箇所を
処理させるロジックを考えていました。
だいたいどの言語も同じような仕様を持っていますが、PHPで文字列をコードとして実行するのは、
eval()になります。
たとえばテンプレートファイルを
sample.tmp
<html> <head> </head> <body> _PHP for( $i=0 ; $i<10 ; $i++ ) echo "Hello World\n<BR>"; </body> </html>
としておいて、
<?php $handle = @fopen("sample.tmp", "r"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle, 4096); if( substr( $buffer, 0, 4 ) == "_PHP" ) { eval( substr( $buffer, 4, -1 ) ); } else { echo $buffer; } } fclose($handle); } ?>
とすれば、テンプレート内で _PHP で始まる行をコードとして処理します。
この結果は"Hello World" が十回画面に表示されます。
ありがとうございます。
eval(); は知りませんでした。大変助かりました。
また、下記コメント欄にもあるようにセキュリティ面の忠告も
ありがとうございます。テンプレートはクライアントのみが
修正するのですが、充分気をつけていただくよう伝えておきます。
こんな感じでどうでしょうか。
スクリプトは $instr に入れるとします。複数行にも対応しています。
<?php $instr =<<< EOT <?php echo 'hello world!'; ?> EOT; preg_match("/<\?(php)?(.*)\?>/ms", $instr, $arr); $e = isset($arr[2]) ? $arr[2] : ''; eval($e); ?>
ただし、evalでエラーが発生したとき(入力したスクリプトが間違っているとき)の処理をしていません。
これに関連しますが、クロスサイトスクリプティング攻撃を受ける可能性が高いプログラムですので、実装に当たっては十分にご注意ください。
ありがとうございます。
実際はもっと複雑な処理になるのですが、スクリプトが
間違っている場合の対応はなかなか厳しいですね。
また、クライアントが埋め込んだコードに脆弱性があるかもしれないので
その辺も充分注意してもらうよう伝えておきます。
ありがとうございます。
eval(); は知りませんでした。大変助かりました。
また、下記コメント欄にもあるようにセキュリティ面の忠告も
ありがとうございます。テンプレートはクライアントのみが
修正するのですが、充分気をつけていただくよう伝えておきます。