こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

外部ファイル記述内容をヒアドキュメント上で実行

題名の通りなのですが、説明が難しいです..
外部のテキストファイルを読み込み、もしPHPスクリプトが記述されていたら、それを実行させたいです。

例えば、下記のようなテキストファイルをディレクトリにアップし・・

(テキストファイルtext.txt内容)
テスト,これはテストです。 <?php echo (date("Y年m月d日")); ?>
テスト2,これはテストです2

下記のようなスクリプトがあったとして・・

(PHP実行ファイル内容)
<?php
$text = file_get_contents("text.txt");
$text = explode("\n", $text);
$num0 = explode(',', $text[0]);
$num1 = explode(',', $text[1]);
$subject0 = $num0[0];
$subject1 = $num1[0];
$body0 = $num0[1];
$body1 = $num1[1];
echo <<<EOD
<p>{$subject0}<br>{$body0}</p>
<p>{$subject1}<br>{$body1}</p>
EOD;
?>

実行すると、出力は・・

(実行結果)
<p>テスト<br>これはテストです。 <?php echo (date("Y年m月d日")); ?></p>
<p>テスト2<br>これはテストです2</p>

・・というようになるかと思います。
ようは、<?php echo (date("Y年m月d日")); ?>がそのまま文字列として出力されるだけです。
これを、下記のような出力結果が得られるようにしたいです・・

(欲しい実行結果)
<p>テスト<br>これはテストです。 2016年11月10日</p>
<p>テスト2<br>これはテストです2</p>

何か方法はありますでしょうか?
ご教示頂けましたら幸いです。

投稿日時 - 2016-11-10 00:13:16

QNo.9253691

暇なときに回答ください

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

セキュリティ上、外部ファイルの中のプログラムを実行するのはよくないので、
 <?php echo (date("Y年m月d日")); ?>
と書いておくのではなく
 [[TODAY]]
とか書いておいて置換処理するのが一般的かと思います。

一応 eval() と言うのがありますので実行可能ですが、PHPの開始タグ・終了タグは抜かなければいけないので、外部ファイルの記述を変える必要があります。

投稿日時 - 2016-11-10 10:01:26

お礼

ありがとうございます。
evalが参考になりました。
下記の記述で思っていたのが、実現しました。

<?php

$text = <<<EOM
テスト,これはテストです。 <?php echo (date("Y年m月d日")); ?>
テスト2,これはテストです2
EOM;

$text = explode("\n", $text);
$num0 = explode(',', $text[0]);
$num1 = explode(',', $text[1]);
$subject0 = $num0[0];
$subject1 = $num1[0];
$body0 = $num0[1];
$body1 = $num1[1];

echo eval("?>".<<<EOM
<p>{$subject0}<br>{$body0}</p>
<p>{$subject1}<br>{$body1}</p>
EOM
);

?>

実現できたのでベストアンサーとさせて頂きます。

投稿日時 - 2016-11-10 21:57:42

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

#1の御回答のように外部ファイルの信頼性がないと 怖いですし
読んだ後にキーを置換するほうが、見通しもよいとは思いますが、
PHPの出力をバッファリングして 変数に格納してしまうということは可能ではあります。

$text = file_get_contents("text.txt");
のかわりに
ob_start();
include("text.txt");
$text = ob_get_contents();
ob_end_clean();
って感じです。

投稿日時 - 2016-11-10 14:41:11

お礼

ありがとうございます。
とりあえず別の方法でできました。
信頼性は不安ですが、外部ファイルとはいえ、自分のアップロードしたファイルのみ読み込みで、不特定多数のファイルを読み込ませるわけではないです。

ご教示いただいたコードは今後の参考にさせて頂きます。

投稿日時 - 2016-11-10 21:59:22

ANo.2

そんなコード、外部ファイル云々の前にこう書いたって動きませんよ。
<?php
echo <<<EOD
<p>テスト<br>これはテストです。 <?php echo (date("Y年m月d日")); ?></p>
<p>テスト2<br>これはテストです2</p>
EOD;
?>

本質的に何がしたいのかよくわかりませんが、「外部ファイルを読み込みそれを実行」でいいのならincludeするのが普通でしょう。

データを読んで取り込みたいのなら、データファイルに日付を出力すべきです。データファイルにPHPのコードを書くなんてありえないと思います。

投稿日時 - 2016-11-10 11:15:23

あなたにオススメの質問