phpの質問です。

ホームページの記事を
PHPを使って簡単な更新をしようと思うのですが、
改行で困っています。

更新ページを用意して、そこにフォームを用意しています。
そこに書かれたものを別ファイルに書き込み、そのファイルを別ページが読みこんでいる形です。

まず入力のphpでは、
<?php
$filepath = "title.txt"; // ファイルへのパスを変数に格納
$string = $_POST['title'];// 書き込みたい文字列を変数に格納
if (isset($string)){
$fp = fopen($filepath, "w"); // 新規書き込みモードで開く wかr
@fwrite( $fp, $string, strlen($string) ); // ファイルへの書き込み
fclose($fp);
}
//ファイルへの書き込みは終了
?>

といった方法で別に置いているファイルに書き込みをさせています。
そのファイルを
<?php
require('title.txt');?>
で読み込みをさせています。
そのさいに最初の書き込みをしたファイルに改行をいれるにはどうしたらいいでしょう?
もちろん<br>とかけば改行できるのですが、できれば<>を使いたくないので、
なにか方法はないでしょうか?
たとえば\nを<br>に変換するとか、なにかお願いします。

回答の条件
  • 1人50回まで
  • 13歳以上
  • 登録:2010/11/24 11:12:07
  • 終了:2010/11/29 04:02:53

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492010/11/24 12:32:19

ポイント21pt

ポイント付きメッセージは届きましたでしょうか?

ご覧のページ内にある「コメント・トラックバックを表示する」にチェックを入れることを再び推奨しておきます

(質問者からの返信の欄は何度でも書き直しが出来るのですが、回答内容の書き直しや追記は出来ない仕様のためです)

 

【1】ヘッダーで対応する

2010-11-24 11:34:20 の投稿がこれなのですが、

出力する内容がテキストファイルのみの場合に有効な手となり、

この方法はページの一部として読み込む場合には適応されません

<?php
    header("Content-type: text/plain");
    require('title.txt');

 

【2】改行が生き残るタグで囲む

(1)textarea

(2)pre - textareaはform内で使うべきなのでpreを推奨

タグなどとして認識されてしまう文字があるのでhtmlspecialcharsを通してから出力する必要あり

<?php
    echo '<pre>';
    $lines = file('title.txt');
    foreach ($lines as $line_num => $line) {
        echo htmlspecialchars($line);
    }
    echo '</pre>';
<?php
    echo '<pre>';
    echo htmlspecialchars( file_get_contents('title.txt') );
    echo '</pre>';

http://www.htmq.com/html/pre.shtml

http://php.net/manual/ja/function.file.php

http://php.net/manual/ja/function.htmlspecialchars.php

http://jp.php.net/manual/ja/function.file-get-contents.php

※ fileは一行ずつ処理を分けたい場合に便利

※ file-get-contentsは一括処理したい場合に便利

 

【3】改行コードを
に置換する

<?php
    $lines = file('title.txt');
    foreach ($lines as $line_num => $line) {
        echo preg_replace( "/\r\n|\r|\n/", '<br>', htmlspecialchars($line) );
    }
<?php
    $file = file_get_contents('title.txt');
    echo preg_replace( "/\r\n|\r|\n/", '<br>', htmlspecialchars( file_get_contents('title.txt') ) );
id:snoopy_japan

返事がおくれてすみません、このはてなを使うのが初めてでお手数をおかけしました。

おかげで解決ができました。

htmlspecialcharsの関数も知らなかったので、とても助かりました。

また質問させてもらうこともあるかと思いますがよろしくお願いします。

2010/11/29 03:57:29

その他の回答(5件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492010/11/24 11:34:20

ポイント21pt

phpのMIMEタイプは自動的にhtmlにされてしまうので、

冒頭で「プレーンテキストです」と指示を送ることで対応したりします

<?php
    header("Content-type: text/plain");
    require('title.txt');

http://jp2.php.net/manual/ja/function.header.php

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492010/11/24 12:32:19ここでベストアンサー

ポイント21pt

ポイント付きメッセージは届きましたでしょうか?

ご覧のページ内にある「コメント・トラックバックを表示する」にチェックを入れることを再び推奨しておきます

(質問者からの返信の欄は何度でも書き直しが出来るのですが、回答内容の書き直しや追記は出来ない仕様のためです)

 

【1】ヘッダーで対応する

2010-11-24 11:34:20 の投稿がこれなのですが、

出力する内容がテキストファイルのみの場合に有効な手となり、

この方法はページの一部として読み込む場合には適応されません

<?php
    header("Content-type: text/plain");
    require('title.txt');

 

【2】改行が生き残るタグで囲む

(1)textarea

(2)pre - textareaはform内で使うべきなのでpreを推奨

タグなどとして認識されてしまう文字があるのでhtmlspecialcharsを通してから出力する必要あり

<?php
    echo '<pre>';
    $lines = file('title.txt');
    foreach ($lines as $line_num => $line) {
        echo htmlspecialchars($line);
    }
    echo '</pre>';
<?php
    echo '<pre>';
    echo htmlspecialchars( file_get_contents('title.txt') );
    echo '</pre>';

http://www.htmq.com/html/pre.shtml

http://php.net/manual/ja/function.file.php

http://php.net/manual/ja/function.htmlspecialchars.php

http://jp.php.net/manual/ja/function.file-get-contents.php

※ fileは一行ずつ処理を分けたい場合に便利

※ file-get-contentsは一括処理したい場合に便利

 

【3】改行コードを
に置換する

<?php
    $lines = file('title.txt');
    foreach ($lines as $line_num => $line) {
        echo preg_replace( "/\r\n|\r|\n/", '<br>', htmlspecialchars($line) );
    }
<?php
    $file = file_get_contents('title.txt');
    echo preg_replace( "/\r\n|\r|\n/", '<br>', htmlspecialchars( file_get_contents('title.txt') ) );
id:snoopy_japan

返事がおくれてすみません、このはてなを使うのが初めてでお手数をおかけしました。

おかげで解決ができました。

htmlspecialcharsの関数も知らなかったので、とても助かりました。

また質問させてもらうこともあるかと思いますがよろしくお願いします。

2010/11/29 03:57:29
id:a-kuma3 No.3

a-kuma3回答回数4521ベストアンサー獲得回数18792010/11/24 13:05:22

ポイント14pt

<pre> もしくは <xmp> でくくる。

<xmp>
<?php require('title.txt');?>
</xmp>
id:snoopy_japan

とか忘れていました。

2010/11/29 03:58:18
id:niwa-mikiho No.4

niwa-mikiho回答回数508ベストアンサー獲得回数382010/11/24 21:45:53

ポイント14pt

恐らくは html で表示するページ内に表示しようとしてるため、改行が改行として扱われないことにアタマを悩ましてるかと思います。



$handle = fopen("title.txt", "r");

$contents = fread($handle, filesize($filename));

fclose($handle);

$contents = ereg_replace("\r|\n|\r\n", "
\n", $contents);


で改行を
付きの改行として置き換えるのも手です。

id:snoopy_japan

ありがとうございます。

2010/11/29 03:59:43
id:windofiuly No.5

windofiuly回答回数62ベストアンサー獲得回数22010/11/25 19:09:22

ポイント20pt

回答投稿の取り消しが出来ないため、1つ無駄にしてしまう結果となり申し訳ありませんでした

ポイント付きメッセージを読むことが出来なかった場合や、回答を読んでもわからないことがあった場合やうまくいかなかった場合には返信欄やコメント欄に記入してください

(解決した場合にも返信やコメントいただけると嬉しいですし、後から見る人のためにもなると思いますので、よろしくお願いします)

 

以下、修正と蛇足です

【修正】

回答2の一番最後の例に含まれている「$file = file_get_contents('title.txt');」は動作テストの消し忘れです

一番最後の例では下記1行だけで済みます

echo preg_replace( "/\r\n|\r|\n/", '<br>', htmlspecialchars( file_get_contents('title.txt') ) );

 

【蛇足】

回答3のxmpは十年以上前に廃止となったタグです

現在でも多くのブラウザが対応していたりはしますが非推奨です

http://www.htmq.com/html/xmp.shtml

(HTML3.x時代までのやりかたです。HTML5.x時代に入りつつある現状で使うのはやめておいたほうがよろしでしょう)

 

回答4のereg_replaceは廃止予定のため非推奨です

http://jp2.php.net/manual/ja/function.ereg-replace.php

(php4.x時代のやりかたです。php6.x時代がそこまで来ている現状で使うのはやめておいたほうがよろしいでしょう)

 

以上、現在では適正でない部分もありますが、私の書いた例以外にも方法はまだまだあるということでご両人が書いてくださったのだと思います

 

【私信的なもの】

いつも簡潔でわかりやすい回答を書かれるid:a-kuma3さんですが今回のxmpは無いと思いますよ

(私の回答を見越してpreを書かなかったのでしょうけど、だとしたら、その目的は・・・)

 

id:niwa-mikihoさんは、もう少し新しい情報を仕入れれば、すばらしい回答者になられると思います

(古い情報を後から回答してどうしたいんだ?と最初に思いましたけどね)

id:snoopy_japan

補足までありがとうございます。

こんなに丁寧に教えていただき感激です。

またよろしくお願いします。

2010/11/29 04:01:45
id:windofiuly No.6

windofiuly回答回数62ベストアンサー獲得回数22010/11/25 19:11:11

ポイント20pt

ポイント付きメッセージは届きましたでしょうか?

ご覧のページ内にある「コメント・トラックバックを表示する」にチェックを入れることを再び推奨しておきます

(質問者からの返信の欄は何度でも書き直しが出来るのですが、回答内容の書き直しや追記は出来ない仕様のためです)

 

【1】ヘッダーで対応する

2010-11-24 11:34:20 の投稿がこれなのですが、

出力する内容がテキストファイルのみの場合に有効な手となり、

この方法はページの一部として読み込む場合には適応されません

<?php
    header("Content-type: text/plain");
    require('title.txt');

 

【2】改行が生き残るタグで囲む

(1)textarea

(2)pre - textareaはform内で使うべきなのでpreを推奨

タグなどとして認識されてしまう文字があるのでhtmlspecialcharsを通してから出力する必要あり

<?php
    echo '<pre>';
    $lines = file('title.txt');
    foreach ($lines as $line_num => $line) {
        echo htmlspecialchars($line);
    }
    echo '</pre>';
<?php
    echo '<pre>';
    echo htmlspecialchars( file_get_contents('title.txt') );
    echo '</pre>';

http://www.htmq.com/html/pre.shtml

http://php.net/manual/ja/function.file.php

http://php.net/manual/ja/function.htmlspecialchars.php

http://jp.php.net/manual/ja/function.file-get-contents.php

※ fileは一行ずつ処理を分けたい場合に便利

※ file-get-contentsは一括処理したい場合に便利

 

【3】改行コードを

に置換する

<?php
    $lines = file('title.txt');
    foreach ($lines as $line_num => $line) {
        echo preg_replace( "/\r\n|\r|\n/", '<br>', htmlspecialchars($line) );
    }
<?php
    $file = file_get_contents('title.txt');
    echo preg_replace( "/\r\n|\r|\n/", '<br>', htmlspecialchars( file_get_contents('title.txt') ) );
  • id:windofjuly
    うぃんど 2010/11/25 01:28:19
    回答投稿の取り消しが出来ないため、1つ無駄にしてしまう結果となり申し訳ありませんでした
    ポイント付きメッセージを読むことが出来なかった場合や、回答を読んでもわからないことがあった場合やうまくいかなかった場合には返信欄やコメント欄に記入してください
    (解決した場合にも返信やコメントいただけると嬉しいですし、後から見る人のためにもなると思いますので、よろしくお願いします)
     
    以下、修正と蛇足です

    【修正】
    回答2の一番最後の例に含まれている「$file = file_get_contents('title.txt');」は動作テストの消し忘れです
    一番最後の例では下記1行だけで済みます
    echo preg_replace( "/\r\n|\r|\n/", '<br>', htmlspecialchars( file_get_contents('title.txt') ) );
     
    【蛇足】
    回答3のxmpは十年以上前に廃止となったタグです
    現在でも多くのブラウザが対応していたりはしますが非推奨です
    http://www.htmq.com/html/xmp.shtml
    (HTML3.x時代までのやりかたです。HTML5.x時代に入りつつある現状で使うのはやめておいたほうがよろしでしょう)
     
    回答4のereg_replaceは廃止予定のため非推奨です
    http://jp2.php.net/manual/ja/function.ereg-replace.php
    (php4.x時代のやりかたです。php6.x時代がそこまで来ている現状で使うのはやめておいたほうがよろしいでしょう)
     
    以上、現在では適正でない部分もありますが、私の書いた例以外にも方法はまだまだあるということでご両人が書いてくださったのだと思います
     
    【私信的なもの】
    いつも簡潔でわかりやすい回答を書かれるa-kuma3さんですが今回のxmpは無いと思いますよ
    (私の回答を見越してpreを書かなかったのでしょうけど、だとしたら、その目的は・・・)
     
    niwa-mikihoさんは、もう少し新しい情報を仕入れれば、すばらしい回答者になられると思います
    (古い情報を後から回答してどうしたいんだ?と最初に思いましたけどね)
  • id:a-kuma3
    > 【私信的なもの】
    > いつも簡潔でわかりやすい回答を書かれるa-kuma3さんですが今回のxmpは無いと思いますよ
    > (私の回答を見越してpreを書かなかったのでしょうけど、だとしたら、その目的は・・・)

    別に <pre> を使う回答を見越して書いたわけじゃないんです (^^;
    いや、xmp って、つい使っちゃうんですよね >便利だから

    良くも悪くも、玉石混合なのが HTML の良いところかな、なんて。

    # あまり、言い訳になって無い...
  • id:tezcello
    もしかして、保存しておいたファイルを require で読み出すのが既定路線って事はありませんか?
    例えば、複数ページから同じファイルを読み出しているとか、複数回読み出しているとか。

    だとすれば、ファイル保存時に処理をするのがよさそうですけど?
    「改行」->「<br>改行」にするのでも、全体を pre で括るのでも。
    ただし、入力時の状態に戻すのが困難になりますが。


    > もちろん<br>とかけば改行できるのですが
    ファイル保存時か読出し時かにかかわらず、入力にタグを許しているので、単純に htmlspecialchars() が使えないのが悩ましいところですね。

    保存したファイルを入力時の状態に戻す可能性があるなら(質問文からはその可能性は低そうだけれど)保存時に<br>を追加してしまうと、元々の <br> との区別のために面倒な処理が必要なのも...

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません