中学受験専門 理科総合研究所 −理総研−

フロントページへ
Name:
Pass:
RSS
: ユーザー登録はコチラ :
左 理総研:技術情報と開発メモ 右

013:正規表現を使い、連続した改行コード・改行文字を取り除く

対象言語:PHP
キーワード:
PHP 5.0 正規表現 パターンマッチ preg_replace 連続 複数 改行コード \n \r
改行文字 削除 3個以上 2個 trim textarea 空白
訪問者がテキストエリアに書き込みができるようなインタラクティブなサイトを構築する場合、入力された文章の内容はさておき、データの整合性を管理者がいちいちチェックしていては大変です。たとえ厳格なルールを設けても、性善説でやっていけるほどサイト運営は甘いモノではないと思うのですよ。
そこでサイト管理者としては、訪問者が入力したデータをチェックしたり整形したりというプロセスを自動化したい。大抵のことはhtmlspecialchars関数でクリアできても、わけも無く改行を乱発する書き込みにはイラッとするコトもある。いや、私は確実にイラッとする。
しかしただ改行コードを削除するだけでは整形しすぎなので、理総研ではよくあるパターンとして「3個以上の改行を2個にする」を以下のように実現しています。ついでに先頭と末尾の無駄な改行と空白も除去します。 改行コードを統一する、という意味でも良いかも知れません。
  • まずPOSTされたデータからHTMLタグ(<,>)やダブルクォーテーション("),シングルクォーテーション(')等特殊文字をHTMLエンティティに置換。超基本ですね。

$text = htmlspecialchars($_POST['text'], ENT_QUOTES);
この段階で入力されたテキストデータが以下のようであったとします。
世の中には3種類の人間が居る。(\n)
(\n)
それは、(\n)
(\n)
(\n)
『数を数えられる人間』と『数を数えられない人間』だ!!!(\n)

1段落と2段落の間は連続した改行コードが2個。2段落と3段落の間は連続した改行コードが3個。そして3段落の最後に改行コード1個。
  • 次にpreg_replace関数と正規表現によるパターンマッチで3個以上の連続した改行コード・改行文字を2個に固定します。同時にtrim関数で先頭と末尾の改行(たとえ1個でも)・空白を除去します。 以下ではバックスラッシュになってますけど、そこは「\」←円マークでOKです。

$text = trim(preg_replace("/(\r\n){3,}|\r{3,}|\n{3,}/", "\n\n", $text));
上記のテキストは以下のように変換されています。
世の中には3種類の人間が居る。(\n)
(\n)
それは、(\n)
(\n)
『数を数えられる人間』と『数を数えられない人間』だ!!!
  • trim関数は文字列の先頭と末尾のホワイトスペースを取り除くもので、ホワイトスペースとは空白だけでなく改行・タブも含みます。指定すれば特定の文字だけを取り除くことも可能です。 詳しくはリファレンスで→PHP: trim - Manual
著者 You Mizuguchi
© 2011 System-iDO IT Devisers