PHPで改行させたいとき、意外とハマりました。
ブラウザで改行させても、ソースでは改行されていなかったり、改行文字が反映していなかったり…
HTML改行タグと改行文字を分けて考える必要がありました。
改行文字が反映しない場合や、改行文字の前にHTMLの改行タグを入れてくれるnl2br()
も紹介します。
この記事を読めば、PHPの改行を使いこなすことができるでしょう。
目次
ブラウザ上で改行する
まずは、ブラウザで改行して表示する方法を見ていきましょう。
改行タグ<br>で改行
1 2 3 |
echo '改行'; echo '<br>'; // xhtmlは<br /> echo 'されました。'; |
ブラウザ表示
改行
されました。
ちゃんと改行されてブラウザに表示されました。
ちなみにhtml5は<br>
ですが、xhtmlなどは<br />
ですね。
改行タグ<br>
も文字列同様きちんと''
(クオート)で囲ってあげましょう。
改行タグ<br>はソースでは改行されない
先ほどのようにブラウザで改行されても、実はブラウザのソースを表示すると改行されていません。
1 2 3 |
echo '改行'; echo '<br>'; echo 'されません。'; |
ソース表示
改行<br>されません。
ブラウザのソースで見ると、改行タグ<br>
も含め、改行されず一行で表示されています。
PHPで改行させたいとき、ここが混乱する元となります。
ソース上で改行する
改行文字”\n”で改行
1 |
echo "改行\nいたしました。"; |
ブラウザ表示
改行 いたしました。
ソース表示
改行
いたしました。
ブラウザ表示の方はよく見ると改行文字"\n"
の箇所に半角スペースが入っていますが、改行されていませんね。
しかしソース表示を見ると改行されています。
改行文字 \n でなぜか改行されない場合
改行文字は""
(ダブルクオート)で囲いましょう。
''
(シングルクオート)で囲うと、改行文字を普通の文字列として出力してしまいます。
1 2 |
// ' '(シングルクオート)で囲うと改行できない。 echo '改行\nできません。'; |
改行\nできません。
改行文字\n がそのまま表示されちゃってますね。
改行文字に関わらず、エスケープシーケンスは""
(ダブルクオート)で囲うのがPHPの鉄則です。
''
(シングルクオート)派のプログラマーは特に気を付けましょう。
改行文字はサーバーOSにより異なる
先ほどから「改行文字"\n"
」という表現を使っていますが、実はサーバーOSにより改行文字は違います。
改行文字一覧
サーバーOS | 改行文字 | 改行コード |
---|---|---|
UNIX系 Mac OS X | \n | LF(ラインフィード) |
Windows | \r\n | CR+LF |
Mac(OS 9以前) | \r | CR(キャリッジリターン) |
レンタルサーバーは大半がUNIX系なので、改行文字は"\n"
が一般的だと思いますが、Windowsや古いMac上にローカル開発環境を構築している方や、Windowsサーバーの方は注意しましょう。
(ただ、Windowsマシンでも仮想環境上に Cent OS などで構築している方は問題ないでしょう。)
定義済み定数「PHP_EOL」でOSを気にせず改行
改行文字はLinuxやWindowsなど、サーバーのOSによって異なることはご紹介しました。
そこでPHPでは、OSを自動判定し改行文字を自動的に設定してくれる、定義済み定数PHP_EOL
を用意しています。
1 2 3 4 5 6 |
echo '改行'; // UNIX系なら \n が、Windowsなら \n\r が改行文字として自動設定される echo PHP_EOL; echo 'しました。'; |
ブラウザ表示
改行 しました。
ソース表示
改行
しました。
動作は改行文字"\n"
と同じですね。
ブラウザとソース両方で改行する
改行タグ<br>と改行文字”\n”で改行
1 2 3 4 5 6 |
echo '改行'; // 改行タグ<br>と改行文字 \n を並べる echo "<br>\n"; echo 'しました。'; |
ブラウザ表示
改行
しました。
ソース表示
改行<br>
しました。
改行タグ<br>
と改行文字\n
を並べて記述したら、ブラウザでもソース上でも改行されました。
ヒアドキュメントで改行
実はヒアドキュメントで改行タグ<br>
だけで、ブラウザ上でもソース上でも改行されるんです!
1 2 3 4 5 |
echo <<< EOD 改行<br> されました。 EOD; // ←必ず最後の区切り文字のあとに改行を入れる |
ブラウザ表示
改行
されました。
ソース表示
改行<br>
されました。
先ほどと同様、ブラウザでもソース上でもきちんと改行してくれました。
ちなみに、最後の区切り文字(EOD;
など)の後に改行がないとエラーになります。
改行を入れるようにしましょう。
参考:PHPのヒアドキュメントでの簡単出力と、よくあるエラー
改行を削除する
改行タグと改行文字とその両方を削除する方法です。
改行タグを削除
HTMLの改行タグ<br>
を削除します。
1 2 3 4 5 6 7 8 9 |
// 改行した文字列を変数に格納 $str = '改行を削除して処理します。<br> ダブルクオートじゃないと改行文字は扱えません。'; // 改行タグ<br>を削除 $str = str_replace('<br>', '', $str); // 表示させるとブラウザ上のみ改行が削除される echo $str; |
ブラウザ表示
改行を削除して処理します。ダブルクオートじゃないと改行文字は扱えません。
ソース表示
改行を削除して処理します。
ダブルクオートじゃないと改行文字は扱えません。
str_replace()
で改行タグ<br>
を空文字に変換することで削除しました。
改行タグ<br>
なので、ソース上は改行されたままです。
改行文字を削除
改行文字\n
を削除します。
1 2 3 4 5 6 7 8 9 |
// 改行した文字列を変数に格納 $str = '改行を削除して処理します。<br> ダブルクオートじゃないと改行文字は扱えません。'; // 改行文字を削除(ダブルクオートで囲うこと) $str = str_replace(array("\r\n","\n","\r"), '', $str); // 表示させるとソース上のみ改行が削除される echo $str; |
ブラウザ表示
改行を削除して処理します。
ダブルクオートじゃないと改行文字は扱えません。
ソース表示
改行を削除して処理します。<br>ダブルクオートじゃないと改行文字は扱えません。
改行文字だけ削除されたため、ソース上では改行が削除されましたが、ブラウザ上では改行されたままです。
改行タグと改行文字をいっぺんに削除
str_replace()
で改行タグと改行文字を両方指定し、削除します。
改行文字だけはダブルクオートで囲うのを忘れないようにしましょう。
1 2 3 4 5 6 7 8 9 |
// 改行した文字列を変数に格納 $str = '改行を削除して処理します。<br> ダブルクオートじゃないと改行文字は扱えません。'; // 改行文字と改行タグを削除(改行文字だけダブルクオートで囲みました。) $str = str_replace(array("\r\n","\n","\r",'<br>'), '', $str); // 表示させるとブラウザとソース両方の改行が削除される echo $str; |
ブラウザ表示
改行を削除して処理します。ダブルクオートじゃないと改行文字は扱えません。
ソース表示
改行を削除して処理します。ダブルクオートじゃないと改行文字は扱えません。
改行タグも改行文字も削除されたため、ソース、ブラウザ両方で改行を削除できました。
改行文字の前にHTML改行タグを挿入する
PHPには改行文字"\n"
の前に改行タグ<br>
(<br />
)を挿入する便利なnl2br()
があります。
nl2br関数
1 2 3 4 5 |
// xhtmlの改行タグ<br /> echo nl2br("改行\nされました。"); // html5の改行タグ<br>は false を設定する echo nl2br("改行\nされました。", false); |
ブラウザ表示
改行
されました。
ソース表示
xhtml準拠
改行<br />
されました。
html5
改行<br>
されました。
nl2br関数の構文
nl2br(改行文字を含む文字列(, xhtml準拠を使うか否か(省略可)))
- 第二引数を指定しないか
true
ならxhtml準拠の改行タグ<br />
を表示 - 第二引数が
false
の場合、html5の改行タグ<br>
を表示
ブログアプリなどを作る際、データベースに改行文字を含む記事本文を格納し、記事を出力するときにこの関数を使うと、自動で改行タグを含めて出力されるので便利でした。
mac OSで \(バックスラッシュ)を表示する方法
オマケですが、macで改行文字を入力する際、\
(バックスラッシュ)を表示させたいときに分からないことがあったので、載せておきます。
バックスラッシュ
option + ¥
Windowsだと¥
(円マーク)ですね。
わたくし、シングルクオート派なもので、改行文字が効かないことでハマったことがあります。
改行タグ<br>
とも混同してしまい、ゴチャゴチャになった経験があったため、ここに載せました。
これでPHPの改行を使いこなしましょう。