복붙노트

DOMNode의 innerHTML을 얻는 방법?

PHP

DOMNode의 innerHTML을 얻는 방법?

PHP DOM 구현에서 주어진 DOMNode의 innerHTML을 얻기 위해 사용하는 함수는 무엇입니까? 신뢰할 수있는 솔루션을 제공 할 수 있습니까?

물론 outerHTML도 그렇게 할 것입니다.

해결법

  1. ==============================

    1.

    이 업데이트 된 변형을 PHP와 비교해보십시오. Manual User Note # 89718 :

    <?php 
    function DOMinnerHTML(DOMNode $element) 
    { 
        $innerHTML = ""; 
        $children  = $element->childNodes;
    
        foreach ($children as $child) 
        { 
            $innerHTML .= $element->ownerDocument->saveHTML($child);
        }
    
        return $innerHTML; 
    } 
    ?> 
    

    예:

    <?php 
    $dom= new DOMDocument(); 
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput       = true;
    $dom->load($html_string); 
    
    $domTables = $dom->getElementsByTagName("table"); 
    
    // Iterate over DOMNodeList (Implements Traversable)
    foreach ($domTables as $table) 
    { 
        echo DOMinnerHTML($table); 
    } 
    ?> 
    
  2. ==============================

    2.

    다음은 함수형 프로그래밍 스타일의 버전입니다.

    function innerHTML($node) {
        return implode(array_map([$node->ownerDocument,"saveHTML"], 
                                 iterator_to_array($node->childNodes)));
    }
    
  3. ==============================

    3.

    요소의 html을 반환하려면 C14N ()을 사용할 수 있습니다.

    $dom = new DOMDocument();
    $dom->loadHtml($html);
    $x = new DOMXpath($dom);
    foreach($x->query('//table') as $table){
        echo $table->C14N();
    }
    
  4. ==============================

    4.

    하임 에이지 (Haim Evgi)의 대답을 단순화 한 버전입니다.

    <?php
    
    function innerHTML(\DOMElement $element)
    {
        $doc = $element->ownerDocument;
    
        $html = '';
    
        foreach ($element->childNodes as $node) {
            $html .= $doc->saveHTML($node);
        }
    
        return $html;
    }
    

    사용 예 :

    <?php
    
    $doc = new \DOMDocument();
    $doc->loadHTML("<body><div id='foo'><p>This is <b>an <i>example</i></b> paragraph<br>\n\ncontaining newlines.</p><p>This is another paragraph.</p></div></body>");
    
    print innerHTML($doc->getElementById('foo'));
    
    /*
    <p>This is <b>an <i>example</i></b> paragraph<br>
    
    containing newlines.</p>
    <p>This is another paragraph.</p>
    */
    

    preserveWhiteSpace 또는 formatOutput을 설정할 필요가 없습니다.

  5. ==============================

    5.

    trincot의 멋진 버전 인 array_map과 implode에 더해서 이번에는 array_reduce를 사용합니다 :

    return array_reduce(
       iterator_to_array($node->childNodes),
       function ($carry, \DOMNode $child) {
            return $carry.$child->ownerDocument->saveHTML($child);
       }
    );
    

    아직도 이해가 안되는데 왜 배열과 반복자를 모두 받아들이는 reduce () 메소드가 없다.

  6. ==============================

    6.

    function setnodevalue($doc, $node, $newvalue){
      while($node->childNodes->length> 0){
        $node->removeChild($node->firstChild);
      }
      $fragment= $doc->createDocumentFragment();
      $fragment->preserveWhiteSpace= false;
      if(!empty($newvalue)){
        $fragment->appendXML(trim($newvalue));
        $nod= $doc->importNode($fragment, true);
        $node->appendChild($nod);
      }
    }
    
  7. from https://stackoverflow.com/questions/2087103/how-to-get-innerhtml-of-domnode by cc-by-sa and MIT lisence