• ベストアンサー

ファイルの読み込みとnl2br

いつもお世話になっております。 ちょっとわからないことがあり質問させていただきます。 ファイルの読み込みで $fp= fopen("1.txt","r"); list($i,$j,$k,$l) = explode(",",fgets($fp)); で1.txtの中身は 1,2,3,aaa\r\nbbbb というカンマ区切りのファイルになっています。 しかし print nl2br($l); をブラウザで見ると\r\nがそのまま表示されてしまいます。 gettype($l)はstringと表示されます。 ちなみに $l="aaa\r\nbbbb"; print nl2br($l); は改行されたものが表示されます。 php4.3.10でレンタルサーバです。 ファイルからの取り出し方に問題があるのでしょうか? もしくはデータのの書き出し方に問題があるのでしょうか?(1.txtはフォーム上から書きこみます) ご教授いただければ幸いです。

  • q-tip
  • お礼率77% (116/149)
  • PHP
  • 回答数2
  • ありがとう数2

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

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

試しに、 $fp= fopen("1.txt","r"); list($i,$j,$k,$l) = explode(",",fgets($fp)); var_dump($l); とやってみると、webブラウザには string(11) "aaa\r\nbbbb" とでて、 $m="aaa\r\nbbbb"; var_dump($m); とやると、webブラウザには string(9) "aaa bbbb" と出ます。 この両者の値は明らかに別モノです。 fgetsは、改行マデを読みますが、\r\nが読まれている時点で、 \r\nを文字列として扱っていることがわかります。 おそらく内部的にエスケープしているのでしょう。 対する $m="aaa\r\nbbbb"; は、\r\nをPHPが改行と扱います。 (逆に\マークそのものがエスケープ文字なので、 ここでの\r\nを文字列と扱わせるには、 \\r\\nとかにしないと駄目だと思います。) コーディング方法は人それぞれなので、ファイルにどのように格納するかは 自由ですが、この場合、改行をかましたいだけでしたら、単純にstr_replace関数を使い、 $fp= fopen("1.txt","r"); list($i,$j,$k,$l) = explode(",",fgets($fp)); のあとに、 $l = str_replace('\r\n','<br>',$l); print($l); とやってあげればよいのではないでしょうか。

q-tip
質問者

お礼

ご回答ありがとうございます。 > この両者の値は明らかに別モノです。 > おそらく内部的にエスケープしているのでしょう。 なるほど、そういうことですね。 盲点になっていました。目から鱗です。 $l = str_replace('\r\n','<br>',$l); print($l); そうですね。 ちなみにブラウザの方はそれでいいかと思うのですが、\r\nをフォームのtextarea上で改行に変換することも可能でしょうか? 質問ばかりですみません。

q-tip
質問者

補足

なんだかよく分からなくなってきたので、 書き出し時に改行→<br> フォーム上は呼び出し時に<br>→改行コードへ という形でうまくいきました。 ありがとうございました。

その他の回答 (1)

  • unimentai
  • ベストアンサー率70% (34/48)
回答No.1

結論から申しますと、データがおかしい可能性が高いです。 と言いますのも、 > $fp= fopen("1.txt","r"); > list($i,$j,$k,$l) = explode(",",fgets($fp)); > > で1.txtの中身は > > 1,2,3,aaa\r\nbbbb の状況では、fgets()はファイルから1行ずつ読み込むので、$lの中身は"aaa\n\n"となっている筈だからです。 恐らく入力データに直接"\r\n"と記入されているものと推測されます。 データ入力の際には"\r\n"と打ち込むのではなく、直接エンターキーにて改行するよう指示して下さい。 尚、上記スクリプトのようにファイルを一括で処理したい場合には、fread()の使用をお勧めします。

q-tip
質問者

お礼

早速のご回答ありがとうございます。 サンプル的に書いたのですが、1.txtは複数行に渡り、カンマ区切りの4つのデータが入りそれを1行ごと読み込みカンマで区切り配列に入れる処理をしています。 また、データ書込のフォーム部分がtextareaなので改行をそのままの改行でなく、改行コードとしてファイルに書き出す必要があるかと思っているのですが、その辺が間違っているのでしょうか?(書き出すときにmysql_escape_stringを使っています) いまいち文字列調整がわからず、間違っているようでしたら何かいい方法がございましたらご教授いただければ幸いです。

関連するQ&A

  • TSVファイルを読み込んで表示したい

    $file="sample.txt"; // 変換対象TSVファイル $fpw = fopen($file,'r'); while (!feof($fpw)) {   $data = fgets($fpw));   $line = explode("\t", $data);   print "line= ".$line[0]."<br>";   print "line= ".$line[1]."<br>"; } としましたがうまく内容が表示されません。 どのようにしたら良いでしょうか?

    • ベストアンサー
    • PHP
  • fgetsの使い方について

    こんばんわ。phpでラジオボタンを使用して投票フォームを作っています。 投票した値をログファイルに書き込んで4項目をカウントできるように格納したいのですが、エラーも出ずにスルーして原因がわからず困っています。 イメージでは ログファイル↓ 24 もちろん 11 するかも 5  わからない 12 ない 問題のソースは以下の通りです。 $write = "$radiobutton"."\n"; $fp = fopen("../php/test1.txt","a+"); $line1=fgets($fp); $line2=fgets($fp); $line3=fgets($fp); $line4=fgets($fp); fputs($fp,$write); fclose($fp); print "fgets1回目=".$line1."<br>\n"; print "fgets2回目=".$line2."<br><br>\n"; print "fgets3回目=".$line3."<br><br><br>\n"; print "fgets4回目=".$line4."<br><br><br><br>\n"; わかる方いましたらご教授お願いします。

    • ベストアンサー
    • PHP
  • ファイルの内容の削除【ファイルシステム関数】

    以下のユーザー定義関数で、POSTで受け取った数値の増減をあるファイルに書き換える作業をおこないたいのですが、1桁の数値であれば問題ないのですが、2桁の数値にし、マイナスの数値で減らすと値が「00」となってしまいます。文字列として認識してしまっているためかとは存じますが、良い解決方法が思い浮かびません。以下ソースです。 <? function cnt($str){ if(isset($_POST[$str])){ $fp = fopen( $str.".txt", "r+" ); flock($fp,2); $count = fgets( $fp, 5 ); $strstr = $_POST["$str"]; $count+= $strstr; rewind( $fp ); fputs( $fp, $count ); flock($fp,3); fclose( $fp ); print($count); }else{ $fp = fopen( $str.".txt", "r" ); $count = fgets( $fp, 5 ); print($count); };} ?> ファイルシステム関数については苦手で、うまく理解しきれていません。 アイデア・解決法をご存知の方がいらっしゃいましたら、ご回答いただければうれしいです。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • テキストファイルの読み込みとファイルポインタについて質問です。

    テキストファイルの読み込みとファイルポインタについて質問です。 最近PHPを勉強し始めました。 fgets()とfseek()についてわからないことがあるので教えて頂けないでしょうか。 現状以下のテキストとPHPファイルを用意しています。 PHPに2行目のbを表示させたいのですが、思ったように表示をさせることができません。 fgets()は"現在のファイルポインタから次の1行を取得" fseek()は"ファイルポインタを指定したバイト数分移動する"と調べてわかりました。 この二つを使って2行目を指定してbを表示したいのですがうまく表示されて困っています。 test.phpのコメントの★の部分がわからない箇所になります。 おそらく根本的な考え方が間違っていると思うのですが…いろいろ調べたのですがわかりませんでした。 申し訳ありませんがご教授願えないでしょうか。 ----------------- new.txt ----------------- a b c d e ----------------- ----------------- test.php ----------------- <?PHP $new_file = 'new.txt'; $fpt = fopen($new_file,'r'); // ファイルオープン直後のポインタ位置 echo '現在の位置=行指定'.ftell($fpt).'<br>'; print fgets($fpt).'<br>'; // ポインタを5進める fseek($fpt,5); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポインタの位置確認 print fgets($fpt).'<br>'; // ★ここでeを表示したい // 現在の位置からポインタを3戻す fseek($fpt,-3,SEEK_CUR); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★行指定が5-3なので2に…ならないです。 print fgets($fpt).'<br>'; // ポインタを先頭へ rewind($fpt); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポイントが先頭にきたか確認 print fgets($fpt).'<br>'; // ポインタを最後へ fseek($fpt,0,SEEK_END); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★new.txtはabcdeの5行なので5になると思いきや18に… print fgets($fpt).'<br>'; fclose($fpt); // ファイルを閉じる ?> ----------------- ----------------- 実行結果 ----------------- 現在の位置=行指定0 a 現在の位置=行指定5 現在の位置=行指定3 b 現在の位置=行指定0 a 現在の位置=行指定18

    • ベストアンサー
    • PHP
  • nl2brが効かないのですが・・・

    phpで、DBから取得した「Hello!! \n World!!!」という文字列を表示したところ。 「Hello!! \n World!!!」とそのまま表示されました。 いろいろ調べた結果、 $a = 'Hello!! \n World!!!'; echo nl2br($a); とシングルクォーテーションで文字列を囲った場合と同じことになっているとわかりました。 しかし、DBから取得して$aに突っ込むまでの作業はFuelPHPというフレームワークでやっており、 じゃあダブルクォーテーションで囲っちゃえばいいじゃん、とはいかないのかなと思います。 私が考えているやれることは、 1.FuelPHPのcoreの部分を修正する 2.nl2br($a)をnl2br(str_replace('\n',"\n",$a))のように一手間加える なのですが、気持ちがよくはありません。 もしかすると、 ・FuelPHPのconfigの問題 ・PHPやapache、DB(MySql)はたまたOSの何らかの設定の問題 なのかな、とは思いますが検討もつかない状況です。 誰か解決策をお持ちの方はいますでしょうか? 因みに、Webサーバーの環境は以下の通りです。 Windows7 HomePremium apache 2.2.21 php 5.3.8 fuelPHP 1.1 MySql 5.5(文字セットはutf-8)

    • 締切済み
    • PHP
  • ファイルの読み書き

    ファイルに文字列を追加したいのですがファイルの開き方が "a" モードで開くと当然文章の最後に文字列が書き込まれることになります。 ですが、最後ではなく最初に文字列を追加したいためにファイルを2回づつ読み込んだり書いたりしたら2回目の読み込み時にバグが出ました どうしたらファイルの文字列を最後ではなく最初に追加できますか? 追加したい文字が: もも 今までのデーターが オレンジ みかん なら、 もも オレンジ みかん のようにしたい。 以下ソース ---ソース--- #include <stdio.h> void main(void){ FILE *fp; char *tm[1000]; char buf[400]; int i=1,sei; fp= fopen("now.txt","w+"); fprintf(fp,"もも"); fclose(fp); //何で最初に書き込んでるんだ? //という突っ込みがあるでしょうが本当に作りたいプログラムは最初にファイルに書き込まないといけないためです。 fp= fopen("now.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[0]=buf; } fclose(fp); printf("%s<br>",tm[0]); //確認用 この時点ではtm[0]に"もも"が入っている fp =fopen("moto.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[i]=buf; printf("%s<br>",tm[i]); //確認 この時点ではtm[1]に"オレンジ" tm[2]にみかんが入っている i++; } printf("%s<br>",tm[0]); //確認用 バグったtm[2]のみかんが入っている printf("%s<br>",tm[1]); //確認用 バグったtm[2]のみかんが入っている printf("%s<br>",tm[2]); //確認用 バグじゃない? fclose(fp); if(i<=1000){ sei=i; } else{ sei=1000; } fp =fopen("chat_deta.txt","w+"); for(i=0;i<sei;i++){ fprintf(fp,"%s\n",tm[i]); //バグった内容が書き込まれるためみかんが3列かきこまれる } fclose(fp); } } ---now.txt--- もも ---moto.txt--- オレンジ みかん 結果として みかん みかん みかん っとなっていますね。

  • C言語のファイル読み込みに関して。

    英文を入力したテキストファイルを読み込むプログラムをつくっているのですが、 ファイル読み込みが上手くできません。 #include<stdio.h> main() { char filename[33]; char sty[512]; FILE *fp; printf("FILENAME: "); fgets(filename, 33, stdin); //読み込むテキストファイルを指定 fp = fopen(filename,"r"); if(fp == NULL){ printf("Can't open the file!\n"); return -1; } fgets(sty, 512, fp); fclose(fp); printf("%s\n",sty); } このプログラムなのですが、どうしても"Can't open the file!"が表示されてしまいます。 どうすればいいのでしょうか?

  • phpでファイルが削除できない

    こんにちは。 ファイル名の書かれたdir.txtを開いて、その中から1日以上経過したファイルを削除するtime.phpを作成しようと思っています。 実行してみると、24時間経過したファイルがあっても 「Warning: unlink() [function.unlink]: Permission denied in C:\Program Files\xampp\htdocs\test\time.php on line 33」 というエラーがでて削除できない 実行結果にprintするように指定していない$imaの数値「1128673152」が表示される。 のですが、どこに間違いがあるのでしょうか? time.phpの内容 ---------------------------------------------------------------------- <html> <body> <?php // ファイルを読み込み専用でオープンする $fp = fopen('dir.txt', 'r'); // 終端に達するまでループ while (!feof($fp)) { // ファイルから一行読み込む $line = fgets($fp); $line = rtrim($line); // ファイルの更新時間を調べる $kousin = filemtime("$line"); // 今の時刻 $ima = time(); // 経過時間を計算する $keika = $ima - $kousin; // 出力する print $line; print "<br>\n"; print $ima; print "<br>\n"; print $kousin; print "<br>\n"; print $keika; print "<br>\n"; clearstatcache(); if ( $keika > 86400 ) { unlink( "$file" ); } } // ファイルをクローズする fclose($fp); ?> </body> </html> ----------------------------------------------------------------------

    • ベストアンサー
    • PHP
  • TSVファイルを読み込んでCSV形式に変換したい

    PHP4でTSVファイルを読み込んでCSVファイルに変換しようとしています。下記のようにしましたがうまくいきません。 どこがおかしいでしょうか? $file="sample.txt"; // 変換対象ファイル $contents =file_get_contents($file); $contents =str_replace("\t", ",", $contents); $fp = fopen ($contents, "r"); while(($line= fgetcsv($fp,1024,","))) { print "line= ".$line[0]."<br>"; print "line= ".$line[1]."<br>"; } よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 古くなったファイルを削除するには?

    あるファイルを読み込んで、その中に書かれたファイル名の中で10日以上、経過したファイルを削除するphpを作ろうとしています。 index.htmlまで削除してしまうとフォルダの中が他人に除かれてしまうおそれがあるので、index.htmlは10日以上経過してもそのまま残しておきたいと思っています。 初心者なりにいろいろな本やphpの礼を参考にしながら下記のphpを作ってみました。 試してみるとindex.htmlまだ削除されていました・・・・ どこにミスがあったのでしょうか? 教えて頂ければ幸いです。 ---------------------------------------------------------------------- // ファイルを読み込み専用でオープンする $fp = fopen('dir.txt', 'r'); // 終端に達するまでループ while (!feof($fp)) { // ファイルから一行読み込む $line = fgets($fp); $line = rtrim($line); // ファイルの更新時間を調べる $kousin = filemtime("$line"); // 今の時刻 $ima = time(); // 経過時間を計算する $keika = $ima - $kousin; // 出力する // print $line; // print "<br>\n"; // print $kousin; // print "<br>\n"; // print $keika; // print "<br>\n"; clearstatcache(); if ( $keika > 864000 && $line != index.html ) { @unlink( "$line" ); } } // ファイルをクローズする fclose($fp);

    • ベストアンサー
    • PHP