お問い合わせフォームの「詳細内容」や、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>
タグが<br>
という無害な文字列に変換(エスケープ)されてしまいます。その結果、ブラウザには改行されずに「<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アプリケーションを構築しましょう。