• ベストアンサー

ファイルの読み込みと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はフォーム上から書きこみます) ご教授いただければ幸いです。

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

  • ベストアンサー
回答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