PHPで改行を扱うときによく出てくるのが、\r と \n です。
どちらも改行に関係する文字ですが、意味は同じではありません。
簡単にいうと、\r は「行の先頭に戻る」、\n は「次の行へ進む」という意味を持つ制御文字です。
なお、PHPで使うのは /r や /n ではなく、バックスラッシュを使った \r と \n です。
"\r"
"\n"
スラッシュ / を使って、
"/r"
"/n"
と書いても、改行コードとしては扱われません。
これは単なる文字列になります。
\rと\nの基本的な違い
\rはキャリッジリターン
\r は Carriage Return の略です。
日本語では「キャリッジリターン」と呼ばれます。
意味としては、カーソルを行の先頭に戻す制御文字です。
もともとはタイプライターの動きに由来しています。
タイプライターでは、文字を打つ位置を左端に戻す操作がありました。
その「行頭に戻す」動きが、キャリッジリターンです。
PHPでは、\r は CR と呼ばれる制御文字として扱われます。
echo "Hello\rWorld";
このコードをターミナルなどで実行すると、環境によっては World が Hello の上から書き込まれるように見える場合があります。
ただし、実際の表示結果は出力先によって変わります。
ブラウザ、ターミナル、テキストエディタ、ログファイルなど、それぞれで見え方が異なることがあります。
そのため、実務では「\r は行頭に戻す文字」というより、CRという改行関連の制御文字として理解しておくと安全です。
\nはラインフィード
\n は Line Feed の略です。
日本語では「ラインフィード」と呼ばれます。
意味としては、次の行へ移動する制御文字です。
PHPで普通に改行を表したい場合、多くのケースでは \n を使います。
echo "こんにちは\n世界";
出力イメージは次のようになります。
こんにちは
世界
PHPで複数行の文字列を扱うときや、テキストファイルに改行を入れたいときには、\n がよく使われます。
OSごとの改行コードの違い
Windowsでは\r\nが使われる
Windowsでは、改行コードとして \r\n が使われます。
echo "1行目\r\n2行目";
この場合、文字列の中には \r と \n の2つの制御文字が入っています。
\r\n
つまりWindowsの改行は、キャリッジリターン + ラインフィード の組み合わせです。
Linuxや現在のmacOSでは\nが使われる
LinuxやUnix系OS、現在のmacOSでは、改行コードとして \n が使われます。
echo "1行目\n2行目";
現在のWeb開発では、サーバーがLinux環境で動いていることも多いため、PHPでは \n を使う場面が多くあります。
古いMac OSでは\rが使われていた
古いMac OSでは、改行コードとして \r が使われていました。
ただし、現在のmacOSはUnix系の仕組みをベースにしているため、基本的には \n が使われます。
そのため、改行コードの違いは次のように整理できます。
| 環境 | 改行コード |
|---|---|
| Windows | \r\n |
| Linux / Unix / 現在のmacOS | \n |
| 古いMac OS | \r |
PHPで\rや\nを使うときの注意点
ダブルクォートでは改行として解釈される
PHPでは、\n や \r はダブルクォートで囲んだ文字列の中で特殊な意味を持ちます。
echo "Hello\nWorld";
この場合、\n は改行文字として解釈されます。
出力イメージは次のとおりです。
Hello
World
同じように、\r もダブルクォート内ではキャリッジリターンとして解釈されます。
echo "Hello\rWorld";
つまり、PHPで実際に改行コードを入れたい場合は、基本的にダブルクォートを使います。
シングルクォートでは基本的にそのまま表示される
一方、シングルクォートで囲んだ文字列では、\n や \r は基本的に改行コードとして解釈されません。
echo 'Hello\nWorld';
この場合、出力は次のようになります。
Hello\nWorld
\n が改行になるのではなく、バックスラッシュと n という2文字として表示されます。
同じように、
echo 'Hello\rWorld';
と書いた場合も、\r はキャリッジリターンとして解釈されず、そのまま表示されます。
Hello\rWorld
ただし、シングルクォート内でも一部のエスケープは有効です。
echo 'It\'s OK';
echo 'C:\\xampp\\htdocs';
シングルクォート内で主に特別扱いされるのは、次の2つです。
\' // シングルクォート
\\ // バックスラッシュ
そのため、PHPでは次のように覚えるとわかりやすいです。
echo "Hello\nWorld"; // 改行される
echo 'Hello\nWorld'; // 改行されない
HTMLでは\nだけでは見た目の改行にならない
HTMLソース上では改行される
PHPでブラウザに文字列を出力するとき、\n を使うとHTMLソース上では改行されます。
echo "こんにちは\n世界";
HTMLソースとして見ると、次のように改行されている場合があります。
こんにちは
世界
しかし、ブラウザの画面上では、通常この改行はそのまま表示されません。
ブラウザ上で改行したい場合は<br>を使う
HTMLでは、画面上で改行を表示したい場合、基本的には <br> タグを使います。
echo "こんにちは<br>世界";
ブラウザ上では次のように表示されます。
こんにちは
世界
PHPの \n は、HTML上の見た目の改行とは別物です。
そのため、ブラウザで見える改行を入れたい場合は、次のように考えるとよいです。
"\n" // HTMLソース上の改行
"<br>" // ブラウザ表示上の改行
nl2br()を使う方法もある
PHPには、改行文字の前に <br> や <br /> を挿入する nl2br() という関数があります。
$text = "こんにちは\n世界";
echo nl2br($text);
このコードでは、文字列中の改行の前に <br> が挿入されます。
ブラウザ上では、次のように表示されます。
こんにちは
世界
注意点として、nl2br() は改行文字を削除して <br> に置き換えるわけではありません。
正確には、改行文字の前に <br> を挿入する関数です。
また、シングルクォートで次のように書いた場合は注意が必要です。
$text = 'こんにちは\n世界';
echo nl2br($text);
この場合、\n は改行文字ではなく、単なる文字列です。
そのため、nl2br() を使っても期待どおりに改行されません。
正しくは次のように、ダブルクォートを使います。
$text = "こんにちは\n世界";
echo nl2br($text);
PHPで改行コードを統一する方法
外部入力では改行コードが混在することがある
フォーム入力、CSVファイル、テキストファイル、APIレスポンスなどを扱う場合、改行コードが混在していることがあります。
たとえば、次のような改行コードが同じデータ内に含まれることがあります。
\r\n
\n
\r
このままだと、行単位で処理するときに扱いづらくなる場合があります。
そこで、最初に改行コードを統一しておくと便利です。
\nに統一するコード例
改行コードを \n に統一する場合は、次のように書けます。
$text = str_replace(["\r\n", "\r"], "\n", $text);
このコードでは、まずWindows形式の \r\n を \n に変換し、そのあと残った \r も \n に変換します。
この順番は重要です。
先に \r だけを置換すると、\r\n のうち \r だけが置換され、意図しない結果になる可能性があります。
そのため、改行コードを統一するときは、次の順番で考えると安全です。
$text = str_replace(["\r\n", "\r"], "\n", $text);
正規表現で改行コードを扱う方法
\r\n、\r、\nを個別に指定する
正規表現で改行コードを扱う場合、次のように書くことができます。
$lines = preg_split("/\r\n|\r|\n/", $text);
このコードでは、\r\n、\r、\n のいずれかにマッチした場所で文字列を分割します。
さまざまなOS由来の改行コードが混在している可能性がある場合に使えます。
\Rを使う方法もある
PHPのPCRE正規表現では、\R を使って改行シーケンスを表すこともできます。
$lines = preg_split("/\R/", $text);
\R は、複数の種類の改行に対応できる便利な表現です。
そのため、改行コードの種類をあまり意識せずに分割したい場合は、\R を使うとシンプルに書けます。
$text = "apple\r\nbanana\norange";
$lines = preg_split("/\R/", $text);
print_r($lines);
出力イメージは次のとおりです。
Array
(
[0] => apple
[1] => banana
[2] => orange
)
PHP_EOLとは?
実行環境に応じた改行コードを表す定数
PHPには PHP_EOL という定数があります。
echo "Hello" . PHP_EOL . "World";
PHP_EOL は、PHPが実行されている環境に応じた改行コードを表します。
たとえば、一般的には次のようになります。
| PHPの実行環境 | PHP_EOL |
|---|---|
| Windows | \r\n |
| Linux | \n |
| macOS | \n |
PHP_EOLは出力先ではなく実行環境に依存する
PHP_EOL を使うときに注意したいのは、出力先の環境ではなく、PHPの実行環境に依存するという点です。
たとえば、Linuxサーバー上でPHPを実行している場合、PHP_EOL は基本的に \n になります。
しかし、そのPHPでWindows向けのCSVファイルを生成する場合、出力先としては \r\n のほうが適していることがあります。
このような場合は、PHP_EOL に頼るよりも、明示的に "\r\n" を使ったほうが意図が伝わりやすいです。
$lineBreak = "\r\n";
つまり、PHP_EOL は便利ですが、常に最適とは限りません。
実務での使い分け
通常のPHP処理では\nを使う
PHP内で普通に改行を扱うだけなら、基本的には \n を使えば問題ありません。
$text = "1行目\n2行目\n3行目";
ログ出力、テキスト処理、内部的な文字列処理では、\n に統一しておくと扱いやすいです。
Windows向けのファイルでは\r\nを使う
Windows環境で扱うテキストファイルやCSVファイルを作る場合は、\r\n を使うことがあります。
$text = "1行目\r\n2行目\r\n3行目";
file_put_contents("sample.txt", $text);
CSVをExcelで開くことを想定している場合も、\r\n を使ったほうが無難なケースがあります。
$csv = "name,age\r\n";
$csv .= "Taro,30\r\n";
$csv .= "Hanako,25\r\n";
file_put_contents("users.csv", $csv);
ただし、CSVを生成する場合は、実務では fputcsv() を使うことも多いです。
HTML表示では<br>やnl2br()を使う
ブラウザ上で見た目の改行をしたい場合は、\n だけでは不十分なことが多いです。
echo "こんにちは\n世界";
このコードでは、HTMLソース上では改行されても、ブラウザ表示では改行されないことがあります。
ブラウザ上で改行したい場合は、次のように <br> を使います。
echo "こんにちは<br>世界";
また、ユーザーが入力したテキストの改行をブラウザ上に反映したい場合は、nl2br() が便利です。
$text = "こんにちは\n世界";
echo nl2br($text);
よくある間違い
/nと書いてしまう
改行コードは /n ではありません。
間違いです。
echo "Hello/nWorld";
正しくは、バックスラッシュを使います。
echo "Hello\nWorld";
シングルクォートで書いてしまう
次のコードは、改行されません。
echo 'Hello\nWorld';
\n を改行として使いたい場合は、ダブルクォートで書きます。
echo "Hello\nWorld";
HTMLで\nだけを使ってしまう
PHPでは改行文字として扱われても、HTMLの画面表示では改行されないことがあります。
echo "1行目\n2行目";
ブラウザ上で改行したいなら、次のようにします。
echo "1行目<br>2行目";
または、
$text = "1行目\n2行目";
echo nl2br($text);
を使います。
まとめ
PHPの \r と \n は、どちらも改行に関係する制御文字です。
\r はキャリッジリターンで、行の先頭に戻る意味を持ちます。
\n はラインフィードで、次の行へ進む意味を持ちます。
現在のPHP開発では、通常の改行には \n を使うことが多いです。
一方、Windows向けのテキストファイルやCSVファイルを作る場合は、\r\n を使うことがあります。
特に重要なのは、次のポイントです。
"\n" // Linux / Unix / 現在のmacOSで使われる改行
"\r\n" // Windowsで使われる改行
"\r" // 古いMac OSで使われていた改行
また、PHPではダブルクォートとシングルクォートの違いにも注意が必要です。
echo "Hello\nWorld"; // 改行される
echo 'Hello\nWorld'; // 改行されない
HTML上で見た目の改行をしたい場合は、\n ではなく <br> や nl2br() を使います。
実務では、外部入力の改行コードをいったん \n に統一してから処理すると、扱いやすくなります。
$text = str_replace(["\r\n", "\r"], "\n", $text);
PHPで改行を扱うときは、単に「改行したいから \n」と覚えるだけでなく、出力先がテキストなのか、HTMLなのか、Windows向けファイルなのかを意識して使い分けることが大切です。
以上、PHPの/rと/nの違いについてでした。
最後までお読みいただき、ありがとうございました。










