PHP DOM कार्यान्वयन में दिए गए DOMNode के इनर HTML को प्राप्त करने के लिए आप किस फ़ंक्शन का उपयोग करते हैं? क्या कोई विश्वसनीय समाधान दे सकता है?
बेशक बाहरी एचटीएमएल भी करेगा।
PHP DOM कार्यान्वयन में दिए गए DOMNode के इनर HTML को प्राप्त करने के लिए आप किस फ़ंक्शन का उपयोग करते हैं? क्या कोई विश्वसनीय समाधान दे सकता है?
बेशक बाहरी एचटीएमएल भी करेगा।
जवाबों:
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);
}
?>
DOMDocument
। लाइन-ब्रेक जैसे कुछ व्हाट्सएप को संरक्षित करने के लिए trim
एक ltrim
(या यहां तक कि इसे पूरी तरह से हटाने के साथ) बदलना चाह सकता है।
DOMElement
इसके बजाय फंक्शन घोषणा को बदलना पड़ा । बस के मामले में यह किसी और को यात्रा करता है। DOMNode
DOMDocument::getElementById()
html
किसी तत्व को वापस करने के लिए , आप C14N () का उपयोग कर सकते हैं :
$dom = new DOMDocument();
$dom->loadHtml($html);
$x = new DOMXpath($dom);
foreach($x->query('//table') as $table){
echo $table->C14N();
}
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
।
के साथ 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()
तरीका नहीं है जो सरणियों और पुनरावृत्तियों को समान रूप से स्वीकार करता है।
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);
}
}
यहाँ Drupella द्वारा php.net की इस टिप्पणी के आधार पर एक और दृष्टिकोण दिया गया है, जिसने मेरी परियोजना के लिए अच्छा काम किया है। यह स्पष्ट रूप से चाइल्ड नोड्स पर पुनरावृत्ति करने के बजाय innerHTML()
एक नया DOMDocument
, आयात और इसे लक्ष्य नोड में जोड़कर परिभाषित करता है ।
आइए इस सहायक समारोह को परिभाषित करते हैं:
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
पुरानी क्वेरी, लेकिन ऐसा करने के लिए एक अंतर्निहित विधि है। बस लक्ष्य नोड को पास करें 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>