fopenでファイル読み込み、置換や修正したい

このQ&Aのポイント
  • fopen関数を使用してファイルを読み込み、その取り込んだファイルを置換や修正したいです。includeではなくfopenを使用してPHPの機能を取り込みたいですが、現状ではPHPの構文が表示されてしまいます。
  • includeやリクワイヤーではなくfopenを使用してファイルを読み込み、PHPの構文を置換や修正する方法を知りたいです。fopenで取り込むとPHPの構文をstr_replaceなどで置換できると思っています。
  • fopen関数を使用してファイルを読み込む方法を教えてください。PHPの構文を置換や修正したいので、fopenを使用する方法を知りたいです。
回答を見る
  • ベストアンサー

fopenでファイルを読み込み、その取り込んだファイルを置換や修正したい。

こんばんわ。 AというファイルにBというファイルを読みこもうと思うのですがうまくいきません。 ■a.php <?php // ファイルを読み込み専用でオープンする $fp = fopen('b.php', 'r'); // 終端に達するまでループ while (!feof($fp)) { // ファイルから一行読み込む $line = fgets($fp); // 読み込んだ行を出力する print $line; // <br>の出力 print "<br>"; } // ファイルをクローズする fclose($fp); ?> ■b.php <div class="title">コンテンツ</div> <?php $amin = 1; //最小値 $amax = 4; //最大値 $randevent = rand($amin,$amax); //値を表示 if ( $randevent == 1) echo "たちつてと"; // else if ( $randevent == 2) echo "さしすせそ"; // else if ( $randevent == 3) echo "かきくけこ"; // else if ( $randevent == 4) echo "あいうえお"; ?> と、二つのファイルはこのような内容です。 もちろんincludeやリクワイヤーで取り込めばすむのでしょうが、fopenで取り込んで表示させたいのです。 このままの文章だとPHPの構文ごとHPに表記されてしまいます。 Printにしているからでしょうか? fopenでPHPの機能ごと取り込むには方法はありませんでしょうか? includeだと取り込んだ際にPHP構文の置換や修正がきかなくて困るんです。 fopenで取り込むとPHP構文を「あいうえお」の部分を「なにぬねの」にstr_replaceで置換できると思ったのです。 a.phpの中にfopenを使いb.phpの中のPHP構文を機能させる方法はありませんか?

noname#20805
noname#20805
  • PHP
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
回答No.1

b.phpをファイル読み込みしているのでそのまま吐き出されています。 PHP構文だとしてもそれは既に文字列として扱われます。 a.phpから値をいじりたいというのなら変数をグローバルアクセス化して includeした方が速いですね。 a.php <?php include "b.php"; $abc = "なにぬねの"; test(); ?> b.php <?php $abc = "あいうえお"; function test(){ global $abc; echo $abc; } ?>

noname#20805
質問者

お礼

ありがとうございます。 うまく質問ができなかったのですが、 bというファイルをを取り込んで、 とりこんだBのPHP構文を修正したいのです。 アドバイスいただけると幸いです。

その他の回答 (1)

回答No.2

> bというファイルをを取り込んで、 > とりこんだBのPHP構文を修正したいのです。 Bファイルを実行とかではなくて、単純にBファイルを書き換えたいという事ですか? それならBファイルを全部配列等で取得して 対象となる場所だけ書き換えてから Bファイルをfwriteを使って再度作成すれば良いと思います。 それを実行させたいなら、上記処理を行った後に includeすれば良いでしょう。 テキトーに作ってみました。 【a.php】 <?php $bdat = file("b.php"); $fp = fopen('b.php', 'w'); //「あいうえお」を「なにぬねの」に置換し、ファイルを書き換える foreach ($bdat as $key => $value) { $bdat[$key] = mb_ereg_replace("あいうえお", "なにぬねの", $value); fwrite($fp, $bdat[$key]); } fclose($fp); ?>

noname#20805
質問者

補足

ありがとうございます。 これなら $amax = 4; //最大値 の数値を2や3にもできますね。 応用が利きそうで助かりました。 ただ、<b.php>は<a.php>以外のファイルからも使いまわしたいので上書き保存より別名で保存のようなことはできませんか?

関連するQ&A

  • fopenでファイルが開かない場合・・

    現在あるサーバ上で問題なく利用できるファイル関数のfopenが、別のサーバに変えたらエラーになってしまいました。 if( ( $fp = fopen( $dir.$datefile ,"w" ) ) != FALSE ){ print "OK"; exit; // fwrite( $fp , $new_data ); // @chmod( $dir.$datefile , 0755 ); } else { print "no"; exit; } 上記で else に入ってしまいます。 なにか原因があるのでしょうか、まったくわからず困っています。 どなたかご教授下さい。

    • ベストアンサー
    • PHP
  • fopenのコード

    初歩的なことですがファイルをオープンするfopenの例題で *************************** #include<stdio.h> int main (void) {   FILE  *fp;     fp = fopen ("test1.txt","w");   if (fp==NULL) {     printf ("ファイルをオープンできませんでした。\n");     return 1;   }    else {     printf ("ファイルをオープンしました。\n");   }    fclose (fp);   printf ("ファイルをクローズしました。\n");    return  0; } *********************************というのがあります。 この中のif文の中のreturnの戻り値が1なのはなぜでしょうか? (例題によっては-1というのもありましたが・・。) またどこに戻り値を返すのでしょうか? もしファイルがオープンできなければその時点で終了になるのでしょうか?初歩的なところですがお願いします。

  • 複数のプログラムを1ページで行えますか?

    PHP始めたばかりです。 下記の事で困っています。 単体ではうまく動くのに二つ並べると動作しません。 どうしたら複数のプログラムを1ページで行えますか? どこかに番号を付けて同じにならないようにするのかなとは思いますが分かりません。 ご教示お願い致します。 <?php $file = 'txt/a0001.txt'; if ($_POST['button_save']) { //POSTされたときは書き込み処理をする $fp = @fopen($file, 'w'); if ($fp == false) { print "このファイルには書き込みできません。<br>\n"; } else { $contents = htmlspecialchars($_POST['textBox_contents']); fwrite($fp, $contents); fclose($fp); print "書き込み完了しました。<br>\n"; } } $text = file_get_contents($file); $text = htmlspecialchars($text); ?> <textarea name="textBox_contents" cols="40" rows="2"><?php echo($text); ?></textarea> <br/> <input type="submit" name="button_save" value="保存"> </form> <p> <p> <?php $file = 'txt/b0001.txt'; if ($_POST['button_save']) { //POSTされたときは書き込み処理をする $fp = @fopen($file, 'w'); if ($fp == false) { print "このファイルには書き込みできません。<br>\n"; } else { $contents = htmlspecialchars($_POST['textBox_contents']); fwrite($fp, $contents); fclose($fp); print "書き込み完了しました。<br>\n"; } } $text = file_get_contents($file); $text = htmlspecialchars($text); ?> <textarea name="textBox_contents" cols="40" rows="2"><?php echo($text); ?></textarea> <br/> <input type="submit" name="button_save" value="保存"> </form>

    • ベストアンサー
    • PHP
  • flockのファイル保持について

    一つのブラウザで以下のプログラムを動かしつつ、、 ---- lock.php ---- <?php $filnam = "./log.txt"; $fp = fopen($filnam,"w"); flock($fp, LOCK_SH); ?> ここでしばらく待つ。 <?php sleep(30); flose($fp); ?> ------------------ もう一つのブラウザで ---- if.php ---- <?php $filnam = "./log.txt"; $fp = fopen($filnam,"w"); // ・・・(1) if(!flock($fp, LOCK_EX)){ print ("ロックされています。<BR>"); }else{ print ("ロックされていません。<BR>"); } ?> ------------------ を動かしました。 期待していた結果は 「ロックされています。」の表示です。 ですが、lock.phpプログラムの終了を、(1)の部分で待っているようで、lock.phpプログラムが終了後、「ロックされていません。」の表示になります。 ロックされていたらすぐに「ロックされています。」の表示を出したいのですが、どうしたらいいでしょうか?何か勘違いをしている部分があればご教授ください。

    • 締切済み
    • PHP
  • fopenが動作しない

    PHPで、別のファイルで取得したファイル名をもとに fopenを使ってファイルを開こうとしているのですが、 どうしてもうまくいきません。 具体的な症状は以下のとおりです。 a.phpの中で、 … $file[2] = "hoge02.xml"; … のように、配列にファイル名を代入します。 これを b.php で require_once('a.php'); とした後 print_r($file); とすると Array([0] => … [2] => "hoge02.xml" [3]…) のように表示されるところまでは確認できました。 しかし、 $file0 = $file[2]; $fp = fopen("$file0", 'r'); とすると Warning: fopen( "hoge02.xml" ) [function.fopen]: failed to open stream: Invalid argument in [b.php の絶対アドレス] とエラーが出てしまい、実行することが出来ません。 そこで、 //$file0 = $file[2]; $file0 = "hoge02.xml"; $fp = fopen("$file0",'r'); とすると実行することが出来ました。 作成しているシステム上、fopenの1つ目の引数には変数または配列を使いたいのですが、 エラーが発生してどうしてもうまくいきません。 自分なりにも似たようなエラーがないか調べたのですが、 それらしいものを見つけることが出来ず、お手上げ状態です。 どなたか解決策をご存じないでしょうか。 ご教授の程、よろしくお願い致します。

    • 締切済み
    • PHP
  • fopenしてくれない。。。

    こんにちは。PHP初級者です。 postgresqlに入れたデータをCSVファイルに書き込んで、出力してみたいと思って以下のプログラムを作ってみました。 $file_name ="insatu.csv"; //データベースから呼び出し以下の$arrayへいれるデータは省略します。 //今回は1行のみのデータを入力プログラムになってますが、本当は何行もやるプログラムとなってます。 $array = compact("a","b","c","d","e","f","g","h","i","j","k","l"); $string = implode("," , $array); $file = fopen($file_name, "a") or die ("openエラー $file_name"); flock($file, LOCK_EX); fputs($file, $string."\n"); flock($file, LOCK_UN); fclose($file); $file = fopen($file_name, "r"); while($array = fgetcsv($file, 1000, ",")){ echo "<hr> \n"; for($i=0; $i< count($array); $i++){ echo $array[$i]."<br>"; } } fclose($file); なぜか最初の fopenで dieの方へ行って OPENエラーメッセージが出てきます。 この作業をするためには何かあらかじめ入れなくてはいけない構文とかあるんでしょうか?何か間違っていますでしょうか? それともphp.iniを設定するとかしなくてはいけないんでしょうか? php5を使用してますが、php.iniやphp.ini-distはともに見つからず。 困り果ててます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • fopen関数について

    ----------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char filename[80],ss[256]; printf("ファイル名="); gets(filename); if((fp=fopen(filename,"r"))==NULL){ printf("ファイルをオープンできません.\n"); exit(1); } while(fgets(ss,256,fp)!=NULL){ printf("%s",ss); } puts(""); fclose(fp); return 0; } ----------------------------------------- 初心者な内容の質問ですいません。 以上のプログラムでまず、「gets(filename);」により、「filename[80]」の配列に「aaa.txt」という文字列を格納し、そのファイルをfopenで読もう込もうとしています。 そこで、 if((fp=fopen(filename,"r"))==NULL) の部分に疑問があるのですが、「filename」という配列名だけで中身の「aaa.txt」と何故認識できるのでしょうか? 配列名ということで、先頭アドレスのみの情報しかないと思いました。 教えていただければ嬉しいです。

  • ファイルの置換

    ファイルを置換するプログラムを作ったのですがうまく置換してくれません。コードは以下のように書きました。(コンパイラは出来ました) #include <stdio.h> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 main() { FILE *fp; char filename[256]; FILE *outfp; char outfilename[256]; char key[128]; char str[128]; char c; int p; int keylen; int i=0 ; int search=FALSE; int count =0; printf(" enter filename"); scanf("%s",filename); printf("seach word"); scanf("%s",key); keylen=strlen(key); printf("change word"); scanf("%s",str); if((fp=fopen(filename,"r"))==NULL) { printf("file open error"); exit(1); } strcpy(outfilename,filename); strcat(outfilename,"_"); if((outfp=fopen(outfilename,"w"))==NULL) { printf("file open error"); exit(1); } while((c=fgetc(fp))!=EOF) { if(search) { if(c != key[i]) { search=FALSE; for(p=0;p<i;p++) { fputc(key[p],outfp); } fputc(c,outfp); i=0; } else{i++;} } else { if(c==key[i]) {search=TRUE;i++;} else {fputc(c,outfp);} } if (keylen==i) { count++; fputs(str,outfp); search=FALSE; i=0; } } fclose(fp); fclose(outfp); printf("apperance number %d\n",count); return 0; } どこか間違っていますか?教えてください。

  • 条件文について

    PHPのサンプルを勉強していると 簡単な構文でも「if」などの条件文が 必要以上に使われ故意に複雑にしているように見えます。 -------------------------------------- if(!empty($name) || !empty($naiyou)){ $keijiban = "keijiban.txt"; $fp = fopen($keijiban, "a"); if($fp){ if (flock($fp, LOCK_EX)){ if (fwrite($fp, $data) === FALSE){ print "ファイル書き込みに失敗しました"; } flock($fp, LOCK_UN); }else{ print "ファイルロックに失敗しました"; } } fclose($fp); } ----------------------------------------- 上記は正しいサンプル構文になるようで、 流れは大体理解できるのですが そんなところまで条件分岐をしなくてはいけないのかな? と思ってしまいます。 初学者の私が上のサンプルと同じ内容の構文を書くとしたら 以下のように条件分岐をできるだけ 少なくして考えてしまいます。 ----------------------------------------- if(!empty($name) || !empty($naiyou)){ $fp = fopen("keijiban.txt", "a"); flock($fp, LOCK_EX); fwrite($fp, $data); flock($fp, LOCK_UN); fclose($fp); }else{ print "エラー"; } ----------------------------------------- 条件分岐をできるだけ多く使うことは 必要なのでしょうか? 条件分岐で詳細に分けるのは どのような利点が具体的にあるのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • xreaで7行のプログラムがエラー

    <?php print '<body>'; print 'print関数は成功。<br>'; $fp = fopen('dat.dat', 'wb'); if(!$fp)print '失敗。'; else{print '成功。';fclose($fp);} ?> ブラウザは以下のように表示しました。 どこがいけないのでしょうか? print関数は成功。 Warning: fopen(dat.dat): failed to open stream: Permission denied in ****/foptest.php on line 4 失敗。

    • 締切済み
    • PHP

専門家に質問してみよう