web-dev-qa-db-ja.com

\ nの代わりにPHP_EOLを使用するのはいつですか?その逆もありますか? Ajax / Jqueryクライアントの問題

特定の文字列を改行で分割するphpパーサーがあり、次のようなことをしています。

$lines = explode(PHP_EOL,$content);

サーバー側で作業する場合、パーサーは正常に機能します。ただし、(jqueryの$ .postメソッドを使用して)ajaxによるpostを介してコンテンツを渡すと、問題が発生します。改行が認識されません。そのため、ほぼ1時間のテストと頭痛の種の後、PHP_EOLを「\ n」に変更することにしました。それは機能しました:

$ lines = explode( "\ n"、$ content);

今それは動作します!くそー、私はとても多くの時間を失った! PHP_EOLと「\ n」を適切に使用すると、誰かが私に説明してくれるので、将来時間を節約できますか?あなたの親切な答えに感謝します;)

22
fabio

定数 _PHP_EOL_ は、通常、プラットフォーム固有の出力に使用する必要があります。

  • 主にファイル出力のために本当に。
  • 実際、ファイル関数は、fopen(…, "wb")バイナリモードで使用しない限り、Windowsシステムでは_\n_←→_\r\n_をすでに変換しています。

ただし、ファイル入力の場合は、_\n_を選択する必要があります。ほとんどのネットワークプロトコル(HTTP)は_\r\n_を使用することになっていますが、これは保証されていません。

  • したがって、_\n_で分割し、オプションの_\r_を手動で削除するのが最善です。

    _$lines = array_map("rtrim", explode("\n", $content));
    _

    または、 file(…, FILE_IGNORE_NEW_LINES) 関数をすぐに使用して、EOL処理をPHPまたは auto_detect_line_endings に任せます。

  • より堅牢で簡潔な代替手段は、 preg_split() と正規表現を使用することです。

    _$lines = preg_split("/\R/", $content);
    _

    _\R_プレースホルダー は、 \r\n。したがって、最も安全であり、Classic MacOS _≤ 9_テキストファイルでも機能します(実際にはめったに見られません)。

    必須のミクロ最適化ノート:
    正規表現にはコストがかかりますが、PHPでの手動ループや文字列後処理よりも驚くほど高速であることがよくあります。

そして、avoid_PHP_EOL_-- プラットフォームのあいまいさ

  • HTTP over fsockopen() などのネットワークプロトコルペイロードの手動生成。
  • mail() およびMIME構築の場合(実際には、とにかく面倒な作業を行うべきではありません)。
  • ファイル出力、if必要な一貫性のある環境に関係なく、Unix _\n_改行だけを記述します。

したがって、ファイルに書き込まないときはリテラル_"\r\n"_の組み合わせを使用しますが、ネットワークの改行を予期する特定のコンテキスト用にデータを準備します。

44
mario

PHP_EOLは、ログファイルなどの出力を書き込むときに使用する必要があります。

プラットフォームに固有の改行が生成されます。

9
alex

PHP_EOLは、サーバープラットフォームで使用される改行文字を保持する定数です。 Windowsの場合は\r\nです。 * nixでは、\nです。あなたはどうやらWindowsサーバーを持っています。

* nixサーバーを使用している場合、\nになるため、この変更によって修正されることはありません。クライアント(ブラウザなど)にデータを送信する場合は、\r\nを使用して改行が認識されるようにする必要があります。

5
Jonah

_PHP_EOL_は、サーバーが使用する行末ですPHPが実行されています。ユーザーが送信したコンテンツは、使用する形式に関係なく行末になる可能性があります。ただし、改行で展開するのではなく、 file()関数を使用すると、目的どおりに動作します。

2
mfonda