フォーム改行処理
そふぃのPHP入門 >> PHP実践リファレンス >> フォーム処理 >> フォーム改行処理

フォーム改行処理

改行文字と<br />

フォームのテキストエリア内には改行を含める事ができます。掲示板などのアプリケーションにはほとんどテキストエリアでの入力がついていると思いますが、テキストエリア内で改行した文字というのはどういう扱いになるでしょう。

この改行というのは、\nに代表されるように「改行文字」と言われるもので、「改行」を表す特殊文字です。テキスト上などではこの特殊文字が「改行」と扱われますが、これをブラウザに表示させてもブラウザ上では改行されません。ブラウザはHTMLを解釈するものなので、ブラウザ上での改行にはHTMLでの改行を表す、<br />などのHTMLタグを使用します。

参考 改行処理

テキストエリアなどの改行文字を含める事ができるアプリケーションでは、この改行文字を<br />(や<br>)に変換してやらないと、ブラウザ上での改行がされませんので注意して下さい。

以下のフォームスクリプトは、入力された文字列を表示するだけの簡単なスクリプトですが、改行処理を施していません。

<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post">
  <textarea name="messege" rows="3" cols="50">
1行目
2行目
  </textarea>
  <input type="submit" value="送信" />
</form>
<div>■入力文字■</div>
  1. <?php
  2. // HTML文字のエスケープ
  3. $text = htmlspecialchars( $_POST["messege"] );
  4.  
  5. // magic_quotes_gpcの値がONなら\削除
  6. if ( get_magic_quotes_gpc() ) {
  7.   $text = stripslashes( $text );
  8. }
  9. print $text;
  10. ?>

出力結果

■入力文字■

試しに上記のフォームに改行を含む文字列を入力して実行してみて下さい。めんどくさければ最初から挿入されている文字で構いません。テキストエリア内では改行されているのに、ブラウザ表示部分で改行がされていないのが分かります。

改行文字を<br />に変換

テキストエリアからの入力は改行も含めてそのまま表示したいのが普通ですので、ブラウザ上でも改行して表示させたいところです。

ブラウザ上で改行するには\nなどの改行文字がある場所に<br />などの改行タグを挿入すればいいだけなのですが、この処理もPHPの関数1つでできます。この処理をしてくれる関数はnl2br()です。

参考関数

  • nl2br() ---- 改行文字の前にHTMLの改行タグを挿入する

書式

  • string nl2br( string string )

nl2br()は改行文字を検出して、その改行文字の前に<br />などのHTML改行タグを挿入してくれる関数です。全ての改行文字を検出するので、改行文字にを使用していても(\nでも\rでも\r\nでも)心配する必要はありません。

挿入する改行タグは、PHP4.0.5以降では<br />を、それ以前のバージョンでは<br>です。これはPHP4.0.5以降でXHTML互換になった為と解説されていますが、実際は「PHP4.0.5以上を使用しているけれど<br>を挿入したい」という方もたくさんいるでしょう。その辺の処理は後ほどやりますので、まずはnl2br()の使用方法から覚えて下さい。

nl2br()を使用して改行処理を施したフォームが以下のようになります。

<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post">
  <textarea name="messege" rows="3" cols="50">
1行目
2行目
  </textarea>
  <input type="submit" value="送信" />
</form>
<div>■入力文字■</div>
  1. <?php
  2. // HTML文字のエスケープ
  3. $text = htmlspecialchars( $_POST["messege"] );
  4.  
  5. // magic_quotes_gpcの値がONなら\削除
  6. if ( get_magic_quotes_gpc() ) {
  7.   $text = stripslashes( $text );
  8. }
  9.  
  10. // 改行処理
  11. $text = nl2br($text);
  12.  
  13. print $text;
  14. ?>

出力結果

■入力文字■

今度はしっかり改行されて表示されていると思います。

<br />を<br>に変換

さて、上記の処理で挿入された改行文字はPHP4.0.5以上であれば<br />です。まだまだXHTMLに移行していないけれどもPHPは4.0.5以上だ、という方はたくさんいるはずですが、そういった方は<br / >でなく、<br>で挿入したいはずです。

これはどうすればいいかというのはいろいろな方法がありますが、正規表現が分かる方は、正規表現を使って、nl2br()を使わないという手があります。

  1. <?php
  2. $text = "1行目
  3.  2行目";
  4.  
  5. $new_text = preg_replace("/(\r\n|\n|\r)/", "<br>$1", $text);
  6. echo htmlspecialchars($new_text);
  7. ?>

出力結果

1行目<br> 2行目

正規表現が分からない場合は、str_replace()で改行文字を<br>+改行文字に変換すればいいでしょうね。以下のスクリプトは上記の正規表現を使用したスクリプトと同じ事を、正規表現を使わないでやってるだけです。

  1. <?php
  2. $text = "1行目
  3.  2行目";
  4.  
  5. // 改行文字配列
  6. $linefeed = array("\r\n", "\n", "\r");
  7. // 置き換え後の<br>配列
  8. $html_br = array("<br>\r\n", "<br>\n", "<br>\r");
  9.  
  10. $new_text = str_replace($linefeed, $html_br , $text);
  11. echo htmlspecialchars($new_text);
  12. ?>

出力結果

1行目<br> 2行目

str_replace()関数は文字列を置き換えてくれる関数で、preg_replace()はその正規表現バージョンだと思ってもらえばいいです。str_replace()の使い方や正規表現についてはここではあまり詳しくやりませんのでご了承下さい。

参考関数

  • str_replace() ---- 文字列を置き換える
  • preg_replace() ---- 正規表現検索および置換を行う

書式

  • mixed str_replace( mixed search , mixed replace , mixed subject , int &count )

書式

  • mixed preg_replace( mixed pattern , mixed replacement , mixed subject [, int limit [, int &count ]] )