今回は、改行について書いていきます。
まだ、素のPHPでお問い合わせフォームを作成するという研修中ですが、
その中で、
<br />に四苦八苦!!したので経緯と自分なりの結論を書きたいと思います。
まず、ある程度の文章が入ると想定される『お問い合わせ内容』欄を下記のように記述していました。
【入力画面】
<th>お問い合わせ内容</th>
<td><textarea name="sample"><?php echo nl2br(htmlspecialchars($input['sample'], ENT_QUOTES, 'UTF-8')) ; ?></textarea></td>
【確認画面】
<th>お問い合わせ内容</th>
<td><?php echo nl2br(htmlspecialchars($input['sample'], ENT_QUOTES, 'UTF-8')) ; ?></td>
特に、問題無い様ですよね。
ですが、確認画面から入力画面へ戻る度に、改行部分に<br />タグが一つずつ追加されて、それが確認画面へ持ち越されるという現象が発生しました。
こんな感じです。
↓
======================
改<br />(この部分に確認画面→入力画面のたびに<br /><br /><br /><br />と増えていく…)
行
======================
調べていくと、使用しているそれぞれのタブと関数の挙動をキチンと把握していなかったということが明らかに…
<textarea>タグ:
ユーザが改行した位置で改行文字(
\r\n、 \n\r、\n および \r。OSによって異なるようです)、が加えられて送信されます。
nl2br関数:
改行文字の前に HTML の改行タグ'<br />' あるいは '<br>' を挿入する関数です。
(ここが知らなかったところですが!)入力文字列に含まれるすべての改行文字 (\r\n、 \n\r、\n および \r) の前に'<br />' あるいは '<br>' を挿入して返すそうです!!
つまり、
改行文字の前にHTMLの改行指定文字を挿入するということで置換はしないということです。
htmlspecialchars関数:
特殊文字を HTML エンティティに変換する。
つまり。文字列のタグを無効化する関数です。
(ここがかんちがいしていたところですが!)
文字列のタグを削除するわけではないということです。
以上の3つのタグと関数の挙動を踏まえると…
まだ、論理的に全てをうまく説明できません!
ということで、解決方法とザックリした結論で今日のとことは、終わります。
<変更前>
【入力画面】
<th>お問い合わせ内容</th>
<td><textarea name="sample"><?php echo nl2br(htmlspecialchars($input['sample'], ENT_QUOTES, 'UTF-8')) ; ?></textarea></td>
<変更後>
【入力画面】
<th>お問い合わせ内容</th>
<td><textarea name="sample"><?php echo nl2br(htmlspecialchars($input['sample'], ENT_QUOTES, 'UTF-8')) ; ?></textarea></td>
nl2brをtextareaと一緒に使わない!
という解決策です。
ちなみに、textareaで入力した改行を含む文字列をhtmlにそのまま渡すと、改行されないまま表示されてしまうので、確認画面での表示には、nl2brは残しておく必要がありますね。
【参考サイト】
http://jp2.php.net/nl2br
http://php.net/manual/ja/function.htmlspecialchars.php
http://www.web-liberty.net/improve/perl/bbs_multiline.html
http://q.hatena.ne.jp/1168260277
http://soudan1.biglobe.ne.jp/qa4497427.html
http://okwave.jp/qa/q4497427.html
http://manji602.hatenablog.com/entry/20130109/1357692244