• ベストアンサー

ファイル内の文字列を処理して、そのファイル内のphpスクリプトを実行

いつも、お世話になります。 a.php 、b.phpについて a.phpで、 次のようにb.phpを読み込んで $filename = "b.php"; $array = file($filename); $html = join('', $array); そして、次のようにしてb.php内の文字列置換 $pattern="/xxxx/"; $replacement="yyyyy"; $html=preg_replace($pattern,$replacement,$html); そして、 print($html); とすれば、b.php内の文字列が置換された後で、html記載内容ががブラウザで表示されます。 ここで、 b.php内にphpスクリプトを記載した場合、そのphpスクリプトは実行されません。 a.phpで include_once($filename); とすれば、実行されます。しかし、b.php内の文字列を処理できません。 b.php内の文字列の処理と、b.php内のphpスクリプトの実行の両方を行う方法なんてないものでしょうか。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

php実行結果(出力文字列部分)に、文字列変換を掛けたいなら、出力バッファー制御で出来ないかな? http://jp.php.net/manual/ja/ref.outcontrol.php <?php ob_start(); $filename = "b.php"; include($filename); // b.php 実行 $buffer = ob_get_clean(); // 実行結果を変数に取得 $pattern="/xxxx/"; $replacement="yyyyy"; $html=preg_replace($pattern,$replacement,$buffer); print($html); // これで、templateぽいことがやれるはず。 ?> もし、順番が逆で、b.php のphpソース部分に先に文字列置換してから、実行したいなら、No1のご回答のように。

参考URL:
http://jp.php.net/manual/ja/ref.outcontrol.php
rqg2010
質問者

お礼

hrm_mmmさん、レスありがとうございます。 こんな関数があるんですね。 htmlの動作を知り尽くしているような関数で驚きでした。 そして、できました。 このようにやってみたかったです。 >// これで、templateぽいことがやれるはず。 と、いうことは、templateを用いればもっとスマートにできるのかな と、更に興味をかきたてられます。 研究してみます。 どうもありがとうございました。

rqg2010
質問者

補足

その後色々と試してみました。 快適です。 これ以上に >templateを用いればもっとスマートにできるのかな と、いうご指摘なのでそちらも試してみます。 まずは、お礼まで。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

普通にはまずできない。 ただし、いろんな制限をクリアすればできないことはない。 (1)b.phpをfile_get_contentsで文字列として読み込む (2)変換してテンポラリファイルに書き込む (3)テンポラリファイルをincludeする 例) //a.php <? $html=file_get_contents("b.php"); $pattern="/fuga/"; $replacement="piyo"; $html=preg_replace($pattern,$replacement,$html); $tmpfname = tempnam("/tmp", "FOO"); $handle = fopen($tmpfname, "w"); fwrite($handle, $html); fclose($handle); include($tmpfname); unlink($tmpfname); ?> //b.php <? print "hoge"; ?> fuga //結果 hogepiyo この方法だと結局ソース部分も一度文字列として評価されるため 置換ルールがソースの想定外の部分に反映される可能性があります。 正規表現でこまかく処理をすれば調整は可能ですが、あまり美しく ないかもしれません。

rqg2010
質問者

お礼

yambejpさん、素早くレスをいただきながら返事が遅くなり申し訳ありません。 >あまり美しくないかもしれません。 アドバイスをいただきながら失礼ですが、 私も同じように感じました。 しかし、phpの動作は速いですね。 実用になります。 ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A