質問: PHPで簡単なブログシステムを作っています。 HTMLを許可するフォームで以下のようなデータを入力した場合に、PHPで次のようにデータを変換して保存したいです(保存先はファイルかデータベースを想定しています) 要するに、普通に書いたテキストの改行は `` に変換し、改行が意味を持たない箇所(`` と `` の間)は詰めておきたいです。 **入力データ:** ``` あいうえお あいうえお かきくけこ さしすせそ ``` **変換後のデータ:** ``` あいうえおあいうえおかきくけこさしすせそ ```
回答: 最初に HTML を DOM オブジェクトに変換して、各ノードを処理して行きます。 ``` かきくけこ さしすせそ Hello World! HTML; $doc = new DOMDocument(); $doc->loadHTML(''.$html); // dummy tag $nodes = $doc->getElementsByTagName('body')->item(0)->childNodes; $replaced = ''; for ($i=1;$i<$nodes->length;$i++) { $node = $doc->saveHTML($nodes->item($i)); if ($nodes->item($i)->nodeName === '#text') { // text without HTML tag if (preg_match('/^\s*$/', $node)) // emtpy node continue; $node = preg_replace('/\h*(\r|\n|\r\n)\h*/', '', $node); } else { // text enclosed by HTML tag $node = preg_replace('/\h*[\r\n]+\h*/', '', $node); } $replaced .= utf8_decode($node); } echo $replaced; // 出力結果 あいうえおあいうえおかきくけこさしすせそHello World! ``` 以下は、HTML 文字列の最初に HTML タグが付いていないテキストがあると `loadHTML()` による処理で p タグが自動的に付加されてしまうのを防ぐためのものです。 ``` $doc->loadHTML(''.$html); // dummy tag ```