DOMNode के भीतर का HTML कैसे प्राप्त करें?


96

PHP DOM कार्यान्वयन में दिए गए DOMNode के इनर HTML को प्राप्त करने के लिए आप किस फ़ंक्शन का उपयोग करते हैं? क्या कोई विश्वसनीय समाधान दे सकता है?

बेशक बाहरी एचटीएमएल भी करेगा।

जवाबों:


152

PHP मैन्युअल उपयोगकर्ता नोट # 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); 
} 
?> 

धन्यवाद। यह बढ़िया काम करता है। $ डोम नहीं होना चाहिए-> परिरक्षण = झूठे; दस्तावेज़ लोड होने से पहले हो?
दाविद ओहिया


अतिरिक्त नोट: PHP 5.3.6 के बाद से आप अस्थायी को छोड़ सकते हैं DOMDocument। लाइन-ब्रेक जैसे कुछ व्हाट्सएप को संरक्षित करने के लिए trimएक ltrim(या यहां तक ​​कि इसे पूरी तरह से हटाने के साथ) बदलना चाह सकता है।
हकरे

इस तरह के एक समारोह को DOMDocument वर्ग में जोड़ा जाना चाहिए।
नैट

3
जब मैं वापसी से गुजर रहा था तो मुझे DOMElementइसके बजाय फंक्शन घोषणा को बदलना पड़ा । बस के मामले में यह किसी और को यात्रा करता है। DOMNodeDOMDocument::getElementById()
miken32

25

यहाँ एक कार्यात्मक प्रोग्रामिंग शैली में एक संस्करण है :

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

13

htmlकिसी तत्व को वापस करने के लिए , आप C14N () का उपयोग कर सकते हैं :

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

2
C14N HTML को वैध XML में बदलने का प्रयास करेगा। उदाहरण के लिए <br> <br> <br> Newbr>
ajbc

यह html, हेड और बॉडी टैग्स को आउटपुट करने वाली saveHTML का उपयोग किए बिना, तत्व के HTML को डंप करने का एक गंदा तरीका है।
CONvid19

9

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


4

के साथ 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()तरीका नहीं है जो सरणियों और पुनरावृत्तियों को समान रूप से स्वीकार करता है।


3
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);
  }
}

2

यहाँ Drupella द्वारा php.net की इस टिप्पणी के आधार पर एक और दृष्टिकोण दिया गया है, जिसने मेरी परियोजना के लिए अच्छा काम किया है। यह स्पष्ट रूप से चाइल्ड नोड्स पर पुनरावृत्ति करने के बजाय innerHTML()एक नया DOMDocument, आयात और इसे लक्ष्य नोड में जोड़कर परिभाषित करता है ।

innerHTML

आइए इस सहायक समारोह को परिभाषित करते हैं:

function innerHTML( \DOMNode $n, $include_target_tag = true ) {
  $doc = new \DOMDocument();
  $doc->appendChild( $doc->importNode( $n, true ) );
  $html = trim( $doc->saveHTML() );
  if ( $include_target_tag ) {
      return $html;
  }
  return preg_replace( '@^<' . $n->nodeName .'[^>]*>|</'. $n->nodeName .'>$@', '', $html );
}

जहां हम दूसरे इनपुट तर्क के माध्यम से बाहरी लक्ष्य टैग को शामिल / बहिष्कृत कर सकते हैं।

उपयोग उदाहरण

यहाँ हम "प्रथम" आईडी विशेषता द्वारा दिए गए लक्ष्य टैग के लिए आंतरिक HTML निकालते हैं:

$html = '<div id="first"><h1>Hello</h1></div><div id="second"><p>World!</p></div>';
$doc  = new \DOMDocument();
$doc->loadHTML( $html );
$node = $doc->getElementById( 'first' );

if ( $node instanceof \DOMNode ) {

    echo innerHTML( $node, true );
    // Output: <div id="first"><h1>Hello</h1></div>    

    echo innerHTML( $node, false );
    // Output: <h1>Hello</h1>
}

लाइव उदाहरण:

http://sandbox.onlinephpfunctions.com/code/2714ea116aad9957c3c437d46134a1688e9133b8


1

पुरानी क्वेरी, लेकिन ऐसा करने के लिए एक अंतर्निहित विधि है। बस लक्ष्य नोड को पास करें DomDocument->saveHtml()

पूर्ण उदाहरण:

$html = '<div><p>ciao questa è una <b>prova</b>.</p></div>';
$dom = new DomDocument($html);
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$node = $xpath->query('.//div/*'); // with * you get inner html without surrounding div tag; without * you get inner html with surrounding div tag
$innerHtml = $dom->saveHtml($node);
var_dump($innerHtml);

आउटपुट: <p>ciao questa è una <b>prova</b>.</p>


चेतावनी: DOMDocument :: saveHTML () पैरामीटर 1 को DOMNode होने की उम्मीद करता है, दी गई वस्तु
इवान गुसेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.