PHPでtextareaの改行を反映!nl2br()とhtmlspecialchars()の正しい使い方

お問い合わせフォームの「詳細内容」や、SNSの投稿文など、ユーザーが複数行にわたる文章を入力する場面では<textarea>タグが使われます。しかし、フォームから送信されたテキストをそのままPHPで表示させると、せっかくの改行がすべて無視され、読みにくい一行の文章になってしまった、という経験はないでしょうか。

これは、HTMLの仕様とPHPのデータ処理に関する理解が必要な、初心者の方が陥りがちなポイントです。

この記事では、<textarea>の入力内容に含まれる改行を正しく表示する方法と、その際に必須となるセキュリティ対策について解説します。


目次

なぜ改行が消えるのか?HTMLのルール

まず理解すべきは、HTMLの基本的なルールとして、ソースコード内の改行や連続した半角スペースは、原則として一つの半角スペースとして扱われるという点です。

ユーザーが<textarea>内でEnterキーを押した際に入力されるのは「改行コード(\n)」と呼ばれる特殊な文字ですが、ブラウザはこれをHTMLの改行として解釈してくれません。HTML上で意図的に改行を行うには、改行を意味する<br>タグを明示的に記述する必要があります。

つまり、PHP側でユーザーが入力した「改行コード」を「<br>タグ」に変換してあげる処理が必要になるのです。


改行を<br>タグに変換するnl2br()関数

この変換作業を簡単に行ってくれるのが、PHPの標準関数であるnl2br()です。

nl2brは「New Line to BReak」の略で、その名の通り、文字列に含まれる改行コードをすべて<br>タグに変換してくれます。

nl2br()の基本動作:

<?php
// 改行コード(\n)を含む文字列
$text = "一行目のメッセージです。\n二行目のメッセージです。";

// nl2br()を使って変換
$converted_text = nl2br($text);

echo $converted_text;
// 出力されるHTML: 一行目のメッセージです。<br />\n二行目のメッセージです。
?>

このように変換されたHTMLをブラウザが読み込むことで、意図通りに改行されて表示されるようになります。


セキュリティと改行処理の正しい順序

ここで、非常に重要なセキュリティの話が出てきます。以前の記事でも解説した通り、ユーザーが入力した値を画面に出力する際は、XSS(クロスサイトスクリピグ)攻撃を防ぐためにhtmlspecialchars()関数で必ずエスケープ処理を行う必要があります。

では、nl2br()htmlspecialchars()は、どちらを先に使うべきなのでしょうか?

結論から言うと、必ずhtmlspecialchars()を先に実行し、その後にnl2br()を適用します。

正しい順序: nl2br(htmlspecialchars(元の文字列))

なぜこの順番なのか? もし順番を逆にしてnl2br()を先に実行すると、文字列の中に<br>タグが挿入されます。その文字列に対して後からhtmlspecialchars()を適用すると、せっかく挿入した<br>タグが&lt;br&gt;という無害な文字列に変換(エスケープ)されてしまいます。その結果、ブラウザには改行されずに「<br>」という文字がそのまま表示されてしまいます。

正しい順番で行えば、まずhtmlspecialchars()でユーザー入力全体を安全な状態にし、その後に安全になった文字列の中の改行コードだけを<br>タグに変換するため、セキュリティと表示の両方を満たすことができます。


実装例:安全なコメント表示プログラム

フォームの<textarea name="comment">から送信された複数行のコメントを、安全かつ改行を維持して表示するサンプルコードです。

receive.phpのサンプルコード:

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>コメント確認</title>
</head>
<body>
    <h1>ご入力いただいたコメント</h1>
    <blockquote style="border-left: 2px solid #ccc; padding: 10px; background: #f9f9f9;">
        <?php
            // フォームから 'comment' という名前でデータが送信されたと仮定
            $comment = $_POST['comment'];

            // 1. まず、htmlspecialchars()で全体をエスケープして安全にする
            $safe_comment = htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');

            // 2. 次に、安全になった文字列の改行を<br>タグに変換する
            $formatted_comment = nl2br($safe_comment);

            // 最終的な結果を出力する
            echo $formatted_comment;
        ?>
    </blockquote>
    <br>
    <a href="form.html">入力フォームに戻る</a>
</body>
</html>

まとめ

<textarea>で入力された改行をWebページに正しく反映させる方法を学びました。

  • HTMLでは改行コードは無視されるため、PHP側で<br>タグに変換する必要がある。
  • その変換にはnl2br()関数が便利。
  • セキュリティのため、必ずhtmlspecialchars()でエスケープした後にnl2br()を適用する

この「先にエスケープ、後にフォーマット」という処理順序は、Web開発における定石です。このルールを守り、安全でユーザーフレンドリーなWebアプリケーションを構築しましょう。

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

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次