この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: 改行出力
SEOタイトル: PHP 改行出力 (\n / PHP_EOL / nl2br) 完全ガイド

この記事の要点
  • PHP の改行コードは \n (LF, Unix) / \r\n (CRLF, Windows) / \r (CR, 旧 Mac) の 3 種
  • 環境依存にしたい場合は PHP_EOL 定数を使う(実行環境の OS に応じて自動切替)
  • HTML に改行を反映するには nl2br($str)
    に変換
  • シングルクォート文字列内では "\n" が展開されない → ダブルクォート / Heredoc を使う
  • ファイル読み書きで改行コードを統一: str_replace(["\r\n", "\r"], "\n", $text) で LF 正規化

PHP の改行コード基礎

PHP で文字列に改行を含める方法は複数あります。エスケープシーケンス \n / \r\n / \r、定数 PHP_EOL、Heredoc/Nowdoc などです。

改行コード一覧

表記名称16進主な OS
\nLF (Line Feed)0x0AUnix / Linux / macOS (X 以降)
\r\nCRLF0x0D 0x0AWindows / HTTP / SMTP プロトコル
\rCR (Carriage Return)0x0DMac OS 9 以前(現代では稀)
PHP_EOL環境依存環境次第OS に応じて自動切替

HTML 出力で改行を反映する: nl2br()

ブラウザは \n を空白として扱うため、フォーム入力の改行をそのまま echo しても見えません。nl2br()
を挿入します:

 を挿入
echo nl2br($comment);
// → 1 行目
// 2 行目
// 3 行目 // XSS 対策とセットで使う echo nl2br(htmlspecialchars($comment, ENT_QUOTES, 'UTF-8')); // CRLF / LF / CR すべて対応 echo nl2br("a\r\nb\nc\rd"); // → a
// b
// c
// d

改行コードの正規化

外部ファイル / フォーム入力 / API 受信などで混在する改行コードを統一する定番処理:

CSV / TSV / ログ出力での改行

Heredoc / Nowdoc での複数行


  

こんにちは、{$name}さん

本日の天気: 晴れ

HTML; // Nowdoc: シングルクォート相当(変数展開なし) $template = <<<'TPL' SELECT * FROM users WHERE name = :name AND status = 'active' TPL; // PHP 7.3+ では終了識別子のインデント可 function buildHtml(string $title): string { return <<

$title

HTML; }

PHP_EOL vs ハードコード

シーン推奨理由
CLI ツールで標準出力PHP_EOLWindows と Unix で適切に改行
HTTP プロトコル ヘッダ"\r\n" 固定RFC 7230 で CRLF 必須
メール (SMTP) 送信"\r\n" 固定RFC 5322 で CRLF 必須
JSON / SQL / 構造化文字列固定 ("\n")OS 依存にすると再現性低下
HTML 出力nl2br()ブラウザは改行を空白扱い
ファイル書き出し(社内のみ)"\n"テキストエディタは両対応

JavaScript / 他言語との対比

// JavaScript も同じ
console.log("abc\n");          // LF
console.log("abc\r\n");        // CRLF
console.log(`line1
line2`);                       // テンプレートリテラルは改行をそのまま含む

// Node.js の改行定数
const os = require('os');
console.log("abc" + os.EOL);    // PHP_EOL 相当

よくあるトラブル

症状原因対処
シングルクォートで改行されない'\n' はリテラルダブルクォートに変更
ブラウザで改行が反映されないHTML が改行を空白扱いnl2br() 適用
Windows で改行が変LF のみ出力 → メモ帳で 1 行にCRLF にするか PHP_EOL を使う
CSV ファイル化けする改行コード不一致CRLF + BOM 付き UTF-8
メール送信失敗ヘッダの改行が LF のみ"\r\n" 固定で出力

FAQ

Q: echo "\n"print("\n") はどちらが速い?
A: echo の方が微妙に速い(言語構造なので関数呼び出しオーバーヘッドが無い)。可読性で選んで問題なし。

Q: nl2br() は元の改行を消す?
A: 消しません。
\n
のように元の改行を残して
を挿入します。HTML ソースを綺麗に保ちたい場合は意図通り。

Q: ヒアドキュメント内で $var を展開させたくない
A: Nowdoc(識別子をシングルクォートで囲む <<<'TPL')を使えば一切展開されません。