PHPで改行した文章を出力したいと思うこともあるでしょう。
プログラムのソースコードを書いたり、文章入力をしているときは、エンターキー押し下げで改行してくれますが、PHPでは改行してくれません。
では、PHPで出力する際には、改行したいときはどのように記述すればよいのでしょうか?
ここでは、PHPで改行を扱うための方法をご紹介し、各方法のメリットとデメリットも説明します。
PHPで文字データを正しく扱うための参考に、ぜひ読んでみてください。
目次
改行の役割
文章の作成やソースコード作成では改行は欠かせませんよね。
たとえば、以下のHTMLソースコードの記述でもブラウザで見れば結果は正しく表示されます。
記述例
1 |
<html><head><metacharset="utf-8"/></head><body><?php $str="文章その1\n文章その2\n文章その3\n";echo$str;?></body></html> |
しかし、これでは、ソースコードに何が記述されているかさっぱりわからず、コーディングにバグがないかを調べたり、修正したりするにも一苦労です。
そこで、一般的には、改行(とインデント)を使って、以下のように記述します。
記述例
1 2 3 4 5 6 7 8 9 10 11 |
<html> <head> <meta charset="utf-8" /> </head> <body> <?php $str = "文章その1\n文章その2\n文章その3\n"; echo $str; ?> </body> </html> |
これで、やっと、HTML記述として何が書いてあるかが簡単に理解できますね。
このように、改行は重要な役割を果たしているのです。
PHPで改行を指定する方法
PHPでは、テキストを出力する際は、echoやprintを使いますが、これらは改行してくれません。そのため、PHPで文字列を出力する際は、あわせて改行も出力します。
以下で、PHPで改行を入れる方法を説明しますが、出力先によって方法が異なります。
ここでは、
・コンソールやソースファイルに出力する場合
・ブラウザに表示する場合
にわけて説明します。
コンソールやソースファイルに出力する場合
以下の3つの方法を紹介します。
・改行コード
・PHP_EOL
・ヒアドキュメント
改行コード
改行コードは、文書の改行を意味する制御文字のことです。C言語やPythonなどのプログラム言語と同様に、PHPでも改行コードが定められています。OS(オペレーティングシステム)によって改行コードが異なります。
OS | 改行コード | 記述 | ASCIIコード |
Unix系、Linux系 | LF(ラインフィード) | \n | 0x0A |
Windows | CR+LF(キャリッジリターン・ラインフィード) | \r\n | 0x0D0A |
なお、PHP処理系では、\n、\r\nのいずれの記述でも改行してくれます。
記述例
1 2 3 |
<?php echo "文章その1\n文章その2\n"; ?> |
結果
1 2 |
文章その1 文章その2 |
PHP_EOL
PHP_EOLはPHPの定義済み定数です。定数としての具体的な文字コード(\nや\r\nなど)は、OSに応じて自動的に設定してくれます。
つまり、OSによって記述を変更することなく改行することができるのです。
また、複数行改行する場合などは、\r\nや\nの連続より見やすくなります。
なお、文字コード(\nや\r\n)は文字列の途中に挿入することで、文字列を複数行に分割できますが、PHP_EOLは文字列の途中に挿入することはできないことに留意して使ってください。
記述例
1 2 3 |
<?php echo "文章その1".PHP_EOL."文章その2".PHP_EOL; ?> |
結果
1 2 |
文章その1 文章その2 |
また、PHP_EOLにセットされている値は以下のようにして調べることができます。
記述
1 2 3 |
<?php echo(bin2hex(constant("PHP_EOL"))); ?> |
結果
1 |
0d0a |
Windowsの場合は上記のようにCR+LF(0x0d0a)がセットされているのが確認できます。
ヒアドキュメント
ヒアドキュメントは、改行や空白を含む少し長い文章などの文字リテラルをPHPソースコードに追加する場合に便利な方法です。文字列内では変数も使えるのも便利です。
書き方は、<<<の後に区切り文字となる識別子を続け、その次の行から対象となる文字列を書き、最後に最初に指定した識別子だけの行を記載します。
1 2 3 |
<<<「識別子」 埋め込みたい文章 「識別子」; |
識別子は任意の文字列が可能ですが、EOM(End Of Message)やEOD(End of Document)などがよく使われます。
ヒアドキュメントは便利ですが、記述ルールに関しては以下の点に注意が必要です。
- ・最初の識別子の後には文字列を記入しない。
- ・最後の識別は行頭をインデントしない。
- ・最後の識別子の末尾にセミコロンを記述する。
また、使うに当たっては、以下の点に留意が必要です。
- ・ヒアドキュメント内の一部文字列をコメントアウトしようと思ってもコメントアウトできない。
- ・文章が長くなると、ヒアドキュメントの先頭と終端の行が分かりづらくなる。
記述例
1 2 3 4 5 6 7 8 9 |
<?php $no = 1; $str = <<< EOM 値=$no AB CD EOM; echo $str; ?> |
結果
1 2 3 |
値=1 AB CD |
ブラウザに表示する場合
以下の2つの方法を紹介します。
- ・brタグを使う
- ・関数nl2br()を使う
brタグを使う
HTMファイルをブラウザで読み込んで表示させる場合は、改行は\nや\r\nではなく、brタグ(<br />)を使用します。
ブラウザでは、\nなどのエスケープ文字も本来の機能を果たさず単なるスペース文字に置き換えられてしまうからです。
記述例
1 2 3 |
<?php echo "文章その1<br />文章その2<br />"; ?> |
結果(ブラウザ)
1 2 |
文章その1 文章その2 |
結果(コンソールまたはHTMLファイル)
1 |
文章その1<br />文章その2<br /> |
nl2br関数
nl2br() は、改行文字の前にHTMLの改行タグである<br />に自動的に追加してくれる関数です。ブラウザで改行文字を有効にしたい場合に便利です。
記述例
1 2 3 |
<?php echo nl2br("文章その1".PHP_EOL."文章その2".PHP_EOL); ?> |
結果(ブラウザ上)
1 2 |
文章その1 文章その2 |
結果(コンソールまたはHTMLファイル)
1 2 |
文章その1<br /> 文章その2<br /> |
改行に関する留意事項
エスケープシーケンスの扱い
PHPで\nなどの改行コードを含むメッセージを出力する際に、エスケープ文字の扱いに留意が必要な場合があります。
うまくいかない例
1 2 3 4 5 6 |
<?php $msg = "メッセージ1\nメッセージ1"; ?> <script> alert("<?php echo $msg;?>"); </script> |
結果
この例では、JavaScriptが実行するのは以下のような関数です。
1 2 |
alert("メッセージ1 メッセージ1"); |
このため、Javascriptエラー(SyntaxError: “” string literal contains an unescaped line break)が発生してしまいます。
以下のように、\nにエスケープ文字(\)を追加することで正常に実行されます。
1 2 3 4 5 6 |
<?php $msg = "メッセージ1\\nメッセージ1"; ?> <script> alert("<?php echo $msg;?>"); </script> |
「”」と「’」の使い分け
PHPで文字列を表す場合には、ダブルクォート(”)とシングルクォート(’)が使えます。その最大の違いはエスケープ文字や変数の利用可否です。
・ダブルクォート(”)で囲った文字列中では変数やエスケープ文字は有効です。
・シングルクォート(’)で囲った文字列中では変数やエスケープ文字は動作しません。
たとえば、変数を値として展開したい場合はダブルクォートを使い、展開したくない場合はシングルクォートを使うとよいでしょう。
ヒアドキュメントでも、識別子をシングルクォートで囲った場合は変数はその値で置き換えられず、変数名がそのまま出力されます。
記述例
1 2 3 4 5 6 7 |
<?php $name = ’名前’; $str = <<< 'EOM' 値:$name EOM; echo $str; ?> |
結果
1 |
値:$name |
まとめ
いかがでしたか?今回は、PHPで改行を処理するための方法について説明しました。
WEB埋め込み型のスクリプト言語であるPHPは、いろんな場面でテキストを埋め込むことができます。
改行をうまく使ってスマートにソースコードを書いたり、見やすいページを作りたいものですね。
この記事が、WebプログラミングやPHPの学習などのお役に立てば幸いです。