PHPのnl2br関数の使い方について

採用はこちら

PHPのnl2br関数は、文字列に含まれる改行文字の前へHTMLの<br>タグを挿入するための関数です。

フォームから入力された文章や、データベースに保存された複数行のテキストをWebページ上でも改行して表示したい場合によく利用されます。

HTMLでは、ソースコード内に改行が含まれていても、通常はブラウザ上の表示にそのまま反映されません。

そのため、PHPで扱っているテキストの改行をHTML上でも表示したい場合には、<br>タグを挿入する必要があります。

nl2brを利用すれば、この処理を簡単に行えます。

たとえば、次のような文字列があるとします。

$text = "こんにちは。\n今日は良い天気です。";

echo nl2br($text);

ブラウザでは、次のように改行して表示されます。

こんにちは。
今日は良い天気です。

nl2brは、フォームの入力内容やコメント、プロフィール文章など、改行を含んだプレーンテキストをHTML上に表示するときに便利な関数です。

目次

nl2br関数の基本的な書き方

nl2br関数の基本的な構文は次のとおりです。

nl2br(string $string, bool $use_xhtml = true): string

第1引数には変換したい文字列を指定します。

第2引数には、挿入するbrタグの形式を指定します。

第1引数に文字列を指定する

もっとも基本的な使い方は次のとおりです。

$text = "1行目です。\n2行目です。\n3行目です。";

echo nl2br($text);

nl2brを利用すると、それぞれの改行位置に<br>系のタグが挿入されるため、ブラウザ上でも改行された状態で表示できます。

第2引数でbrタグの形式を変更する

nl2brの第2引数には、trueまたはfalseを指定できます。

nl2br($text, true);

trueを指定した場合は、次の形式が使用されます。

<br />

一方、falseを指定した場合は次の形式になります。

nl2br($text, false);
<br>

第2引数を省略した場合のデフォルト値はtrueです。

そのため、次の2つは基本的に同じ指定になります。

nl2br($text);
nl2br($text, true);

HTMLで一般的な<br>形式にしたい場合は、次のようにfalseを指定できます。

echo nl2br($text, false);

nl2br関数が対応している改行文字

nl2brは、複数種類の改行文字を認識できます。

具体的には、次の4種類です。

\r\n
\n\r
\n
\r

一般的には、Windowsでは\r\n、LinuxやUnix系の環境では\nがよく利用されます。

\rは古い環境などで使われていた改行形式です。

\n\rは一般的なOSではほとんど利用されませんが、nl2brの対象には含まれています。

そのため、フォームなどから入力された文章について、環境ごとの改行形式を個別に判定しなくても処理できます。

nl2br関数は改行文字そのものを削除しない

nl2brを理解するときに重要なのが、改行文字そのものを<br>へ置換する関数ではないという点です。

nl2brは、改行文字の前へ<br />または<br>を挿入します。

たとえば、次の文字列があるとします。

$text = "PHP\nJavaScript";

次のように処理します。

$result = nl2br($text);

変換後の文字列は、概念的には次のようになります。

PHP<br />
JavaScript

ただし、実際の文字列内部では<br />の後に元の改行文字も残っています。

つまり、nl2brは「改行コードを<br>へ置き換える関数」ではなく、「改行コードの前へ<br>タグを追加する関数」と理解するのが正確です。

通常のブラウザ表示では問題になることはほとんどありませんが、その後に文字列処理を行う場合には覚えておくとよいでしょう。

nl2br関数とechoの違い

nl2brechoは役割が異なります。

nl2brは文字列を変換して、変換後の文字列を戻り値として返す関数です。

一方、echoは文字列などを出力するためのPHPの言語構造です。

たとえば、次のコードではnl2brの変換結果を変数へ格納しています。

$text = "こんにちは\nこんばんは";

$result = nl2br($text);

この時点では、変換結果が$resultに入っているだけです。

ブラウザへ表示したい場合は、次のようにechoを利用します。

echo $result;

もちろん、次のように一行で書くこともできます。

echo nl2br($text);

フォームの入力内容にnl2br関数を使う方法

nl2brがよく利用される場面のひとつが、textareaから送信された文章を表示するときです。

たとえば、次のようなフォームがあるとします。

<form method="post">
    <textarea name="message"></textarea>
    <button type="submit">送信</button>
</form>

ユーザーが次のように入力したとします。

こんにちは。
PHPを勉強しています。
よろしくお願いします。

PHPでは、次のように値を取得できます。

$message = $_POST['message'] ?? '';

単純に改行を表示したいだけであれば、次のように記述できます。

echo nl2br($message);

ただし、フォームから受け取ったユーザー入力をそのままHTMLへ出力する方法は適切ではありません。

入力内容にHTMLやJavaScriptなどが含まれている場合、意図しないコードがブラウザ上で解釈される可能性があるためです。

nl2brとhtmlspecialcharsを組み合わせる方法

ユーザーから入力されたプレーンテキストをHTML本文へ表示する場合には、htmlspecialcharsnl2brを組み合わせる方法が一般的です。

次のように記述できます。

echo nl2br(
    htmlspecialchars($message, ENT_QUOTES, 'UTF-8')
);

htmlspecialcharsを先に実行する

処理の順番は重要です。

基本的には、最初にhtmlspecialcharsを実行してからnl2brを適用します。

nl2br(
    htmlspecialchars($text, ENT_QUOTES, 'UTF-8')
);

htmlspecialcharsによって、入力されたHTML特殊文字をHTMLとして解釈されにくい形式へ変換します。

その後でnl2brを実行し、PHP側から安全に<br>系のタグを追加します。

一方、次のように順番を逆にするのは適切ではありません。

htmlspecialchars(
    nl2br($text)
);

この場合、nl2brが追加した<br>タグまでエスケープされてしまいます。

たとえば、次のような文字列として出力される可能性があります。

&lt;br /&gt;

この状態ではブラウザがbrタグとして認識しないため、意図した改行になりません。

htmlspecialcharsは出力場所に応じて使い分ける

htmlspecialcharsは、HTML本文へプレーンテキストを出力する場合に有効な方法です。

ただし、あらゆる場面で万能なセキュリティ対策になるわけではありません。

HTML属性、URL、JavaScript、CSSなど、データを出力する場所によって適切な処理方法は異なります。

今回のように、ユーザーが入力した文章をHTML本文へプレーンテキストとして表示するケースでは、次の形が基本的な書き方になります。

echo nl2br(
    htmlspecialchars($text, ENT_QUOTES, 'UTF-8')
);

データベースの文章にnl2br関数を使う方法

データベースに保存されている複数行テキストを表示するときにも、nl2brを利用できます。

たとえば、データベースから記事本文を取得したとします。

$body = $row['body'];

HTMLへ表示するときには、次のようにできます。

echo nl2br(
    htmlspecialchars($body, ENT_QUOTES, 'UTF-8')
);

データベースには改行を含む元の文章を保存する

多くの用途では、データベースへ保存するときに<br>タグを追加するのではなく、元の改行を含んだプレーンテキストを保存しておく方法が扱いやすいです。

表示するときだけnl2brを適用すれば、保存されているデータと表示用のHTMLを分離できます。

たとえば、同じ文章を次のような用途で再利用しやすくなります。

  • Webページ
  • メール
  • API
  • CSV
  • JSON

ただし、CMSなどでHTMLやMarkdown自体を保存する設計の場合は、別の処理方法が適していることもあります。

どの方法を採用するかは、アプリケーションの設計によって異なります。

nl2br関数とstr_replaceの違い

改行を<br>へ変換するだけであれば、str_replaceを利用することもできます。

たとえば、次のように記述できます。

$text = "PHP\nJavaScript\nPython";

echo str_replace("\n", "<br>", $text);

ただし、この方法では改行形式について注意が必要です。

str_replaceでは改行コードが残る場合がある

Windowsで一般的な改行形式は\r\nです。

次のように\nだけを置換した場合、\r\nのうち\nは置換できますが、\rが文字列内に残ります。

str_replace("\n", "<br>", $text);

複数種類の改行形式を厳密に処理する場合には、追加の処理が必要になることがあります。

一方、nl2brは次の改行文字を対象として処理します。

\r\n
\n\r
\n
\r

そのため、「テキスト内の改行をHTML上でも表示したい」という目的であれば、nl2brを利用したほうがコードの意図も分かりやすくなります。

また、str_replaceは対象文字列を別の文字列へ置き換える関数ですが、nl2brは元の改行文字を削除せず、その前へbrタグを挿入するという違いもあります。

nl2br関数が効かない場合に確認するポイント

nl2brを使用しているにもかかわらず改行されない場合には、文字列の指定方法などを確認してみましょう。

シングルクォート内の\nに注意する

PHPでは、ダブルクォートとシングルクォートでエスケープシーケンスの扱いが異なります。

次のようにダブルクォートを利用した場合、\nは改行文字として解釈されます。

$text = "PHP\nJavaScript";

そのため、次のコードでは改行が認識されます。

echo nl2br("PHP\nJavaScript");

一方、シングルクォートを使うと、\nは通常そのままの文字列として扱われます。

$text = 'PHP\nJavaScript';

そのため、次のコードでは\nが改行文字として認識されません。

echo nl2br('PHP\nJavaScript');

PHPの文字列リテラルで\nを改行として利用したい場合には、ダブルクォートを使用します。

CSSのwhite-spaceで改行を表示する方法

改行付きテキストをブラウザ上へ表示する方法は、nl2brだけではありません。

CSSのwhite-spaceプロパティを利用することもできます。

white-space: pre-wrapを使う

たとえば、次のようにCSSを指定します。

.message {
    white-space: pre-wrap;
}

HTML側では、次のように出力できます。

<div class="message">
    <?= htmlspecialchars($message, ENT_QUOTES, 'UTF-8') ?>
</div>

この方法では、PHP側で<br>タグを追加しなくても、元の文字列に含まれる改行をブラウザ上へ反映できます。

nl2brとwhite-spaceを使い分ける

HTMLとして<br>タグを挿入したい場合には、nl2brが便利です。

一方、元のプレーンテキストをできるだけ維持し、表示方法をCSS側で制御したい場合には、white-spaceを利用する方法もあります。

用途やWebサイトの設計に応じて使い分けるとよいでしょう。

nl2br関数を使うのに適したケース

nl2brは、改行を含むプレーンテキストをHTML上で表示する場面に適しています。

代表的な用途には、次のようなものがあります。

  • お問い合わせフォームの入力内容
  • コメント欄
  • 掲示板の投稿
  • プロフィール文章
  • 商品説明
  • ユーザーが入力したメモ
  • データベースに保存された複数行文章

特に、「ユーザーが入力した改行をそのままブラウザ上でも表示したい」という場合に便利です。

nl2br関数を使うときの注意点

nl2brは便利な関数ですが、すべての文章へ無条件に使用すればよいわけではありません。

HTMLが含まれる文字列には注意する

すでにHTMLとして作成されている文章へnl2brを適用すると、HTMLソース内の改行にも<br>タグが追加されます。

たとえば、次のようなHTMLが含まれているとします。

<p>
こんにちは
</p>
<p>
こんばんは
</p>

この文字列へ単純にnl2brを適用すると、ソース上の改行位置にも<br>系のタグが追加されます。

その結果、意図しない余白や改行が発生する可能性があります。

そのため、nl2brは基本的にHTMLではなく、プレーンテキストをHTML上へ表示する場合に利用するのが適しています。

ユーザー入力をそのまま出力しない

フォームやコメント欄などから受け取ったデータを、そのまま次のように出力するのは避けたほうがよいでしょう。

echo nl2br($_POST['message']);

HTML本文へプレーンテキストとして表示するのであれば、基本的には次のようにエスケープ処理を行います。

$message = $_POST['message'] ?? '';

echo nl2br(
    htmlspecialchars($message, ENT_QUOTES, 'UTF-8')
);

安全性を考慮しながら利用することが重要です。

PHPのnl2br関数の使い方まとめ

PHPのnl2br関数は、文字列に含まれる改行をWebページ上でも表示したい場合に便利な関数です。

基本的な使い方は次のとおりです。

echo nl2br($text);

HTML本文へユーザー入力を安全に表示する場合には、次のようにhtmlspecialcharsと組み合わせる方法が基本となります。

echo nl2br(
    htmlspecialchars($text, ENT_QUOTES, 'UTF-8')
);

また、nl2brは改行文字そのものを<br>へ置換するのではなく、\r\n\n\r\n\rといった改行文字の前へ<br />または<br>を挿入します。

元の改行文字が文字列内に残る点も、nl2brを正しく理解するうえで重要です。

フォーム、コメント、プロフィール、データベースに保存された文章など、改行を含むプレーンテキストをHTMLへ表示するときには非常に使いやすい関数です。

一方で、すでにHTMLとして構造化されている文章では意図しない<br>が追加される可能性があるため、用途に応じてwhite-space: pre-wrapなどの方法と使い分けるとよいでしょう。

以上、PHPのnl2br関数の使い方についてでした。

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

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