Menu

PHPの改行:\n、PHP_EOL、nl2brの使い方

PHPで改行を出力するには、ダブルクォートの中に"\n"を書くか、PHP_EOLを使います。Webページでは改行が見えないので、<br>かnl2br()を使います。両者の違い、シングルクォートの'\n'が動かない理由、改行での分割や改行の削除方法を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

改行を出力するには、ダブルクォートの文字列の中に\nを書きます:echo "Line 1\nLine 2";。定数PHP_EOLも同じことをし、行末に書くとより読みやすくなります:echo 'Done' . PHP_EOL;。Webページでは改行は改行として表示されないので、<br>かnl2br()が必要です。

シングルクォートとダブルクォートの違い

\nや\tのようなエスケープシーケンスは、ダブルクォートの中でしか働きません。シングルクォートの中の'\n'は、バックスラッシュと文字nの2文字です。これが「\nが効かない」のよくある原因です。

ダブルクォートが理解するすべてのエスケープシーケンスは、文字列のページに載っています。

PHP_EOLと"\n"の違い

PHP_EOLは、PHPが動いているシステムの改行コードで、LinuxとmacOSでは"\n"、Windowsでは"\r\n"です。ターミナルへの出力や、同じマシンで読むファイルに使います。形式が独自の改行コードを定めているときはそれを使います。HTTPヘッダーとメールには"\r\n"が必要で、ほとんどのツールはどこでも"\n"を問題なく読めます。

"\r"は復帰(キャリッジリターン)、"\n"は改行(ラインフィード)です。Windowsのファイルは行末に両方、つまり"\r\n"を使うので、Windowsのユーザーや<textarea>から来たテキストには、予想していない\rの文字がよく含まれています。

HTMLでの改行:brとnl2br

ブラウザは改行を1つの空白にまとめるので、echo "a\nb"はページにa bと表示されます。自分で<br>を出力するか、テキストの改行を残したまま、それぞれの前に<br />を挿入するnl2br()で変換します。実行して、OutputタブとPageタブを比べてください。

Outputタブでは3つとも似たように見えます。Pageタブでは、1つ目は1行につながり、nl2br()は改行され、<pre>は書いたとおりに改行を保ちます。

textareaの入力を改行付きで表示する

<textarea>から来たテキストはユーザーが入力した行を保っていますが、HTMLに出力する前にエスケープする必要があります。順番が重要で、先にhtmlspecialchars()、次にnl2br()です。逆にすると<br />タグそのものがエスケープされてしまいます。実行し、ボックスに何行か入力してPreviewを押すと、$_POSTに値が入った状態で同じスクリプトがもう一度実行されます。

textareaの改行は"\r\n"か"\n"で届きますが、どちらも"\n"を含むので、その文字を数えればどちらでも正しく動きます。ここでエスケープが省略できない理由はhtmlspecialchars()で説明しています。

改行で文字列を分割する

explode("\n", $text)は自分で作ったテキストなら動きます。ユーザーやファイルから来たテキストでは、改行コードが"\r\n"、"\n"、"\r"のいずれかかもしれません。\Rはあらゆる改行に一致するので、preg_split('/\R/', $text)ならそのすべてを扱えます。

文字列から改行を取り除く

複数行のテキストを1行にするには、すべての種類の改行コードを置換します。1文字の改行より先に"\r\n"を置換してください。そうしないと、Windowsの改行が2つの空白になってしまいます。

trim()とrtrim()は文字列の両端の改行を取り除きますが、途中の改行には決して触れません。ファイルから読んだ1行には適した道具で、行をつなげるには不向きな道具です。

よくある質問

PHPで改行をechoするには?

ダブルクォートの文字列の中に\nを書きます:echo "Line 1\nLine 2";。または定数を付け足します:echo 'Line 1' . PHP_EOL;。ブラウザでは改行は表示されないので、そこでは<br>かnl2br()を使います。

PHPで\nが効かないのはなぜですか?

文字列がシングルクォートで、'\n'がバックスラッシュとnになっているか、出力がHTMLとして表示されていてブラウザが改行を空白のように扱っているかのどちらかです。テキストの出力にはダブルクォートの"\n"を、Webページにはnl2br()か<br>を使います。

PHP_EOLとは何ですか?

PHPが動いているOSの改行コードを持つ定数で、LinuxとmacOSでは"\n"、Windowsでは"\r\n"です。ターミナルやローカルのファイル向けの出力に使います。HTTP、メール、CSVファイルでは、たいていOSに関係なく形式が改行コードを決めています。

PHPのnl2brは何をしますか?

nl2br($text)は文字列のすべての改行の前に<br />を挿入するので、<textarea>に入力されたテキストをHTMLで表示しても行が保たれます。先にエスケープしましょう:nl2br(htmlspecialchars($text))。

PHPで文字列から改行を取り除くには?

3種類の改行コードをすべて置換します:str_replace(["\r\n", "\r", "\n"], ' ', $text)、または正規表現でpreg_replace('/\R/', ' ', $text)。末尾の改行だけを取り除くならrtrim($text, "\r\n")を使います。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める