80461


PHPで簡単なブログシステムを作っています。  
HTMLを許可するフォームで以下のようなデータを入力した場合に、PHPで次のようにデータを変換して保存したいです(保存先はファイルかデータベースを想定しています)

要するに、普通に書いたテキストの改行は `<br>` に変換し、改行が意味を持たない箇所(`<ul>` と `<li>` の間)は詰めておきたいです。

**入力データ:**

[code]

    あいうえお
    
    あいうえお
    
    <ul>
      <li>かきくけこ</li>
      <li>さしすせそ</li>
    </ul>
    
[/code]

**変換後のデータ:**

[code]

    あいうえお<br><br>あいうえお<br><br><ul><li>かきくけこ</li><li>さしすせそ</li><br></ul>
    
[/code]


CC BY-SA 4.0
2021-07-29T07:00:05.187
80459
2021-07-29T15:05:24.153
2021-07-29T11:02:19.067
3060
47505
question
php html
PHPでHTMLタグ間の改行を除去する方法を教えて下さい


改行を`<br>`に変換するにPHPの標準関数である[nl2br](https://www.php.net/manual/ja/function.nl2br.php)を利用しましょう  
また改行の除去に関しては文字の置換で対応できます。[str_replace](https://www.php.net/manual/ja/function.str-
replace.php)を利用しましょう

[code]

    $val = "変換したい文字\nここで改行";
    $val = nl2br($val);
    $val = str_replace(array("\r\n", "\r", "\n"), "", $val);
    
[/code]

どの改行コードが渡ってくるのかわからないので三パターンで置換しています。

ちなみに改行が意味のあるHTML構文だと改行を除去してしまうと入力した通りに出力されない可能性があります。  
たとえば`<pre></pre>`なんかだと余分にbrを追加してしまったり、改行がなくなったりしてしまいます。  
練習かとは思いますが、基本的にはhtmlタグを生かすテキストであれば変換せずに入力者に`<br>`を入力してもらうようにしましょう。


CC BY-SA 4.0
2021-07-29T08:04:22.780
80461
2021-07-29T08:04:22.780
22665
80459
answer


最初に HTML を DOM オブジェクトに変換して、各ノードを処理して行きます。

[code]

    <?php
    
    $html = <<<'HTML'
    あいうえお
    
    あいうえお
    
    <ul>
      <li>かきくけこ</li>
      <li>さしすせそ</li>
    </ul>
    
    <p>
    Hello World!
    </p>
    HTML;
    
    $doc = new DOMDocument();
    $doc->loadHTML('<p></p>'.$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*/', '<br>', $node);
      } else {
        // text enclosed by HTML tag
        $node = preg_replace('/\h*[\r\n]+\h*/', '', $node);
      }
    
      $replaced .= utf8_decode($node);
    }
    
    echo $replaced;
    
    // 出力結果
    あいうえお<br><br>あいうえお<br><br><ul><li>かきくけこ</li><li>さしすせそ</li></ul><p>Hello World!</p>
    
[/code]

以下は、HTML 文字列の最初に HTML タグが付いていないテキストがあると `loadHTML()` による処理で p
タグが自動的に付加されてしまうのを防ぐためのものです。

[code]

      $doc->loadHTML('<p></p>'.$html); // dummy tag
    
[/code]


CC BY-SA 4.0
2021-07-29T14:22:25.867
80468
2021-07-29T15:05:24.153
2021-07-29T15:05:24.153
47127
47127
80459
answer