PHPの/rと/nの違いについて

採用はこちら

PHPで改行を扱うときによく出てくるのが、\r\n です。

どちらも改行に関係する文字ですが、意味は同じではありません。

簡単にいうと、\r は「行の先頭に戻る」、\n は「次の行へ進む」という意味を持つ制御文字です。

なお、PHPで使うのは /r/n ではなく、バックスラッシュを使った \r\n です。

"\r"
"\n"

スラッシュ / を使って、

"/r"
"/n"

と書いても、改行コードとしては扱われません。

これは単なる文字列になります。

目次

\r\nの基本的な違い

\rはキャリッジリターン

\rCarriage Return の略です。

日本語では「キャリッジリターン」と呼ばれます。

意味としては、カーソルを行の先頭に戻す制御文字です。

もともとはタイプライターの動きに由来しています。

タイプライターでは、文字を打つ位置を左端に戻す操作がありました。

その「行頭に戻す」動きが、キャリッジリターンです。

PHPでは、\rCR と呼ばれる制御文字として扱われます。

echo "Hello\rWorld";

このコードをターミナルなどで実行すると、環境によっては WorldHello の上から書き込まれるように見える場合があります。

ただし、実際の表示結果は出力先によって変わります。

ブラウザ、ターミナル、テキストエディタ、ログファイルなど、それぞれで見え方が異なることがあります。

そのため、実務では「\r は行頭に戻す文字」というより、CRという改行関連の制御文字として理解しておくと安全です。

\nはラインフィード

\nLine 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の違いについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次