PHPで文字列やテキストファイルを扱う際には、改行コードを意識する必要があります。
改行コードとは、文章の行末を示し、次の行へ移る位置を表す制御文字のことです。
PHPでは主に、LF、CRLF、CRという3種類の改行コードを扱います。
利用するOSやファイル形式、外部サービスの仕様などによって適切な改行コードが異なるため、それぞれの特徴を理解しておくことが重要です。
代表的な改行コードは次のとおりです。
| 種類 | PHPでの表記 | 主な用途 |
|---|---|---|
| LF | \n | Linux、Unix、現在のmacOSなど |
| CRLF | \r\n | Windowsなど |
| CR | \r | Classic Mac OSなど |
PHPでは、単純に「改行したいから\nを使う」と考えるだけでは不十分な場合があります。
HTMLに表示するのか、ファイルへ保存するのか、外部システムへ送信するのかによって、適切な方法を使い分ける必要があります。
PHPで使われる改行コードの種類
LF「\n」
LFは「Line Feed」の略です。
PHPでは\nと記述します。
<?php
echo "1行目\n2行目";
ダブルクォートで囲まれた文字列の中では、\nがLFとして解釈されます。
LFはLinuxやUnix系OS、現在のmacOSなどで一般的に使われている改行コードです。
WebサーバーがLinuxで動作しているケースも多いため、PHP開発でも頻繁に目にします。
また、PHP内部で改行コードを統一して文字列処理を行う場合、LFへ正規化する方法もよく利用されます。
CRLF「\r\n」
CRLFは「Carriage Return」と「Line Feed」を組み合わせた改行コードです。
PHPでは次のように記述します。
<?php
echo "1行目\r\n2行目";
\rがCR、\nがLFです。
そのため、CRLFは\r\nという順番で記述します。
CRLFはWindows環境のテキストファイルなどで広く利用されています。
外部システムの仕様としてCRLFが指定されている場合は、実行環境にかかわらず\r\nを明示して利用するのが適切です。
CR「\r」
CRは「Carriage Return」の略です。
PHPでは\rと記述します。
<?php
echo "1行目\r2行目";
CR単体は、主にClassic Mac OSなどで使われていた改行形式です。
現在のmacOSでは一般的にLFが使用されています。
現在のWeb開発ではCR単体を扱う機会は少ないものの、古いテキストデータや外部ファイルを読み込む場合には遭遇する可能性があります。
PHPで文字列を改行する基本的な方法
「\n」を使用する
PHPで文字列に改行を入れるもっとも基本的な方法は、ダブルクォート内で\nを使用することです。
<?php
$text = "りんご\nみかん\nバナナ";
echo $text;
文字列の内容としては、次のようになります。
りんご
みかん
バナナ
ただし、この方法で入るのは文字列上の改行です。
ブラウザ上でそのまま見た目の改行として表示されるとは限らないため注意しましょう。
「\r\n」を使用する
Windows形式の改行を明示したい場合には、\r\nを使用します。
<?php
$text = "りんご\r\nみかん\r\nバナナ";
特定のファイル仕様や外部システムでCRLFが求められている場合に利用できます。
PHP_EOLを使用して改行する方法
PHPには、実行環境に応じた改行コードを表すPHP_EOLという定数があります。
次のように使用できます。
<?php
echo "1行目" . PHP_EOL;
echo "2行目" . PHP_EOL;
echo "3行目";
文字列を連結するときにも利用できます。
<?php
$text =
"りんご" . PHP_EOL .
"みかん" . PHP_EOL .
"バナナ";
echo $text;
PHP_EOLを使うメリット
PHP_EOLを使用すると、PHPを実行している環境に合わせた改行コードを利用できます。
そのため、CLIプログラムや実行環境向けのログファイルなどを作成する場合には便利です。
OSごとの改行コードを意識せずに記述できるのがメリットです。
PHP_EOLを使わないほうがよいケース
PHP_EOLは万能ではありません。
重要なのは、PHP_EOLが「出力先に最適な改行コード」ではなく、「PHPを実行している環境に対応した改行コード」を表すという点です。
たとえばLinuxサーバー上のPHPから、CRLFを要求する外部システム向けファイルを生成するとします。
この場合、PHP_EOLを使うとLFになる可能性があります。
外部仕様としてCRLFが要求されているのであれば、次のように明示したほうが確実です。
<?php
$text = "1行目\r\n2行目";
ファイル形式や通信仕様で改行コードが決まっている場合は、PHP_EOLではなく仕様に合った改行コードを指定しましょう。
ダブルクォートとシングルクォートの違い
ダブルクォートでは改行コードが解釈される
PHPではダブルクォート内に\nを書くと、LFとして解釈されます。
<?php
echo "こんにちは\nこんばんは";
\rや\tなどのエスケープシーケンスもダブルクォート内では解釈されます。
シングルクォートでは「\n」がそのまま扱われる
一方、次のようにシングルクォートを使った場合は注意が必要です。
<?php
echo 'こんにちは\nこんばんは';
この場合、\nは基本的に改行として解釈されません。
文字列としてのバックスラッシュとnとして扱われます。
改行コードをエスケープシーケンスとして利用したい場合には、ダブルクォートを使用するのが基本です。
ブラウザで改行するときの注意点
PHPで次のように記述しても、ブラウザ上で期待した見た目の改行にならないことがあります。
<?php
echo "こんにちは\nこんばんは";
これはPHPの問題ではなく、HTMLの表示ルールによるものです。
HTMLでは通常、ソースコード内の改行や連続する空白が画面表示上ではまとめて扱われます。
そのため、PHPが出力した\nがHTMLソース内に存在していても、画面上ではそのまま改行として表示されない場合があります。
brタグを使用する
HTML上で明示的に改行したい場合は、<br>タグを使用できます。
<?php
echo "こんにちは<br>";
echo "こんばんは";
これならブラウザ上でも改行して表示できます。
nl2br()で改行をHTMLに反映する方法
フォーム入力など、複数行のテキストをHTML上で表示したい場合にはnl2br()が便利です。
<?php
$text = "PHPを勉強しています。\n改行コードを学習しています。";
echo nl2br($text);
この処理によって、テキスト内の改行位置にHTMLの<br>タグが挿入されます。
そのため、入力された複数行の文章をブラウザでも同じようなレイアウトで表示しやすくなります。
nl2br()は改行コードを完全に置換する関数ではない
nl2br()については、改行コードそのものを<br>へ置き換える関数だと誤解されることがあります。
実際には、改行文字の前に<br>または<br />を挿入する処理です。
元の改行文字自体も文字列の中に残ります。
そのため、厳密には次のような完全置換ではありません。
\n → <br>
HTML表示のために改行タグを付け加える関数と理解するとよいでしょう。
ユーザー入力を改行表示するときの注意点
フォームから受け取った文章をHTMLへ表示する場合、ユーザー入力をそのまま出力するのは避ける必要があります。
たとえば、次のようにhtmlspecialchars()でHTML特殊文字をエスケープしてからnl2br()を適用できます。
<?php
$text = $_POST['message'] ?? '';
echo nl2br(
htmlspecialchars($text, ENT_QUOTES, 'UTF-8')
);
この方法なら、ユーザーが入力した改行を画面へ反映しつつ、HTMLタグなどがそのまま解釈されるリスクを抑えられます。
ただし、htmlspecialchars()だけですべてのXSS対策が完了するわけではありません。
HTML属性、JavaScript、URL、CSSなど、出力する場所によって必要なエスケープ方法が異なります。
PHPで改行コードを統一する方法
外部ファイルやユーザー入力では、LF、CRLF、CRが混在していることがあります。
そのような場合、改行コードをあらかじめ統一しておくと後続の文字列処理が簡単になります。
LFへ統一する
すべての改行コードをLFへ統一する場合は、次のように処理できます。
<?php
$text = str_replace(["\r\n", "\r"], "\n", $text);
この処理では、まずCRLFをLFへ変換し、次にCRをLFへ変換します。
結果として、LF、CRLF、CRが混在していてもLFへ統一できます。
CRLFへ統一する
CRLFへ統一したい場合は、一度LFへ正規化してからCRLFへ変換すると分かりやすくなります。
<?php
$text = str_replace(["\r\n", "\r"], "\n", $text);
$text = str_replace("\n", "\r\n", $text);
一度LFへ揃えることで、既存のCRLFを誤って\r\r\nのような形にしてしまう問題を避けやすくなります。
いきなりLFをCRLFへ変換するときは注意する
次のような処理だけを行う場合は注意が必要です。
<?php
$text = str_replace("\n", "\r\n", $text);
元の文字列にすでにCRLFが含まれていると、その中の\nにも置換が適用されます。
その結果、意図しない改行コードになる可能性があります。
複数の改行コードが混在する可能性がある場合は、先にLFへ正規化する方法が安全です。
改行ごとに文字列を分割する方法
explode()で分割する
改行コードをLFへ統一した後であれば、explode()を使って簡単に1行ずつ分割できます。
<?php
$text = str_replace(["\r\n", "\r"], "\n", $text);
$lines = explode("\n", $text);
foreach ($lines as $line) {
echo $line . PHP_EOL;
}
explode()は指定した区切り文字で文字列を分割し、配列として返します。
改行コードをLFへ統一してから使用することで、CRLFに含まれる\rが行末に残る問題も防ぎやすくなります。
preg_split()で複数の改行コードに対応する
改行コードを事前に変更せずに分割したい場合は、preg_split()を利用できます。
<?php
$lines = preg_split('/\r\n|\r|\n/', $text);
これならCRLF、CR、LFのいずれにも対応できます。
より幅広い改行シーケンスに対応したい場合は、PCREの\Rを利用する方法もあります。
<?php
$lines = preg_split('/\R/', $text);
単純にCRLF、CR、LFだけを扱いたい場合は、具体的な正規表現を書いたほうが初心者にも分かりやすいでしょう。
ファイルへ改行付きで書き込む方法
PHPではfile_put_contents()などを使って、改行付きの文字列をファイルへ保存できます。
<?php
$data = "ログを記録しました。" . PHP_EOL;
file_put_contents(
'log.txt',
$data,
FILE_APPEND
);
実行環境に合わせた通常のログファイルを作成する場合には、PHP_EOLが便利です。
一方、外部システム向けのファイルなどでLFやCRLFが指定されている場合には、明示的に指定します。
LFなら次のようになります。
<?php
$data = "データ\n";
CRLFなら次のようになります。
<?php
$data = "データ\r\n";
出力先の仕様を確認したうえで使い分けることが重要です。
CSVファイルで改行を扱うときの注意点
CSVファイルでは、行ごとに改行コードが使われます。
ただし、CSVを生成するときに単純な文字列連結だけで処理するのはおすすめできません。
たとえば次のようなコードです。
<?php
$csv = $name . ',' . $email . "\r\n";
CSVの値にはカンマやダブルクォート、改行そのものが含まれることがあります。
その場合、正しいエスケープ処理が必要です。
PHPではfputcsv()などのCSV専用機能を利用するほうが安全です。
<?php
$handle = fopen('data.csv', 'w');
fputcsv($handle, ['名前', 'メールアドレス']);
fclose($handle);
CSVについては、改行コードだけでなく、区切り文字、囲み文字、文字コード、BOMなども出力先の仕様に合わせる必要があります。
メールで改行コードを扱うときの注意点
メールでは、本文やヘッダーの改行にも注意が必要です。
メール関連の仕様ではCRLFが使われる場面がありますが、利用するメール送信関数やライブラリ、メールサーバーによって処理方法が異なります。
そのため、メール処理で単純にPHP_EOLを使えば必ず正しいとは限りません。
PHPMailerなどのメールライブラリを利用している場合は、ライブラリ側が適切な形式へ変換してくれることもあります。
メール送信では、自分で改行コードを決め打ちする前に、利用するライブラリや通信仕様を確認することが重要です。
Heredocで複数行の文字列を記述する方法
長い文章をPHPコード内へ記述する場合は、Heredocを利用できます。
<?php
$text = <<<TEXT
これは1行目です。
これは2行目です。
これは3行目です。
TEXT;
echo $text;
Heredocでは複数行の文字列をそのまま記述できます。
メール本文やテンプレート、長いテキストなどを書く場合に、\nを何度も記述するより読みやすくなることがあります。
PHPの改行コードでよくある間違い
シングルクォート内で「\n」を使う
よくある間違いの一つが、次のコードです。
<?php
echo 'こんにちは\nこんばんは';
シングルクォートでは\nが通常の改行として解釈されません。
改行したい場合は、次のようにダブルクォートを使用します。
<?php
echo "こんにちは\nこんばんは";
HTMLで「\n」を使えば画面上でも改行されると思う
次のコードではHTMLソース上に改行が出力されても、ブラウザ上では期待どおりに改行表示されない場合があります。
<?php
echo "PHP\nJavaScript";
ブラウザ上で改行したい場合は、<br>やnl2br()を使います。
<?php
echo nl2br("PHP\nJavaScript");
PHP_EOLをすべての場面で使う
PHP_EOLは便利ですが、外部仕様が決まっているデータでは適切でないことがあります。
たとえばCRLF指定のファイルをLinuxサーバーで生成する場合は、PHP_EOLではなく\r\nを使う必要があります。
重要なのは、PHPを実行しているOSではなく、最終的にデータを利用する側の仕様です。
改行コードを統一せずに文字列処理する
LF、CRLF、CRが混在した文字列をそのまま処理すると、行分割や比較などで予想外の結果になることがあります。
内部処理では一度LFへ統一してから扱うと管理しやすくなります。
<?php
$text = str_replace(["\r\n", "\r"], "\n", $text);
「\n」「\r\n」「PHP_EOL」「br」の違い
PHPの改行処理では、それぞれの用途を理解して使い分けることが重要です。
| 方法 | 主な用途 |
|---|---|
\n | LFを明示したい場合 |
\r\n | CRLFを明示したい場合 |
\r | CRを明示したい場合 |
PHP_EOL | PHPの実行環境に応じた改行 |
<br> | HTML画面上で見た目を改行 |
nl2br() | テキスト内の改行をHTML表示へ反映 |
特に覚えておきたいのは、改行コードとHTMLの<br>は別のものだという点です。
\nや\r\nは文字列データ上の改行です。<br>はHTMLの要素であり、ブラウザ上で視覚的に改行するために使います。
PHPで改行コードを扱うときのおすすめ方法
PHP内部ではLFへ統一する
複数の環境からデータが入ってくる場合は、PHP内部ではLFへ正規化すると扱いやすくなります。
<?php
$text = str_replace(["\r\n", "\r"], "\n", $text);
こうしておけば、explode("\n", $text)などを使った文字列処理もシンプルになります。
外部仕様がある場合は改行コードを明示する
外部システムやファイル形式で改行コードが指定されている場合は、仕様に合わせて明示します。
LFなら次のようにします。
"\n"
CRLFなら次のようにします。
"\r\n"
PHP_EOLに任せるのではなく、相手側の仕様に合わせることが重要です。
HTML表示ではbrまたはnl2br()を使用する
ブラウザ上で文章を改行したい場合は、<br>やnl2br()を使用します。
ユーザー入力を表示する場合は、HTMLエスケープもあわせて行いましょう。
<?php
echo nl2br(
htmlspecialchars($text, ENT_QUOTES, 'UTF-8')
);
CLIやログではPHP_EOLが便利
PHPを実行している環境に合わせて改行したい場合は、PHP_EOLが便利です。
<?php
echo "処理を開始しました。" . PHP_EOL;
echo "処理が完了しました。" . PHP_EOL;
CLIツールや実行環境向けログなどでは、読みやすく記述できます。
PHPの改行コードは出力先に合わせて使い分けよう
PHPで代表的に扱う改行コードは、LFの\n、CRLFの\r\n、CRの\rです。
また、実行環境に応じた改行を利用したい場合にはPHP_EOLを使用できます。
ただし、改行処理でもっとも重要なのは、PHPを実行しているOSだけを基準に考えないことです。
ファイル、HTML、CSV、メール、外部APIなど、最終的にデータを利用する側の仕様によって適切な改行方法は変わります。
PHP内部で文字列を処理する場合はLFへ統一し、外部仕様がある場合は\nや\r\nを明示し、HTMLでは<br>やnl2br()を利用すると整理しやすくなります。
用途ごとの違いを理解しておけば、OSや環境が変わったときにも改行コードによる文字列処理のトラブルを防ぎやすくなります。
以上、PHPで改行コードを扱う方法や種類についてでした。
最後までお読みいただき、ありがとうございました。










