পিএইচপি ডম বাস্তবায়নে আপনি কোনও প্রদত্ত ডোমনোডের অভ্যন্তরীণ এইচটিএমএল পাওয়ার জন্য কোন ফাংশন ব্যবহার করেন? কেউ কি নির্ভরযোগ্য সমাধান দিতে পারেন?
অবশ্যই আউটআরএইচটিএমএলও করবে।
পিএইচপি ডম বাস্তবায়নে আপনি কোনও প্রদত্ত ডোমনোডের অভ্যন্তরীণ এইচটিএমএল পাওয়ার জন্য কোন ফাংশন ব্যবহার করেন? কেউ কি নির্ভরযোগ্য সমাধান দিতে পারেন?
অবশ্যই আউটআরএইচটিএমএলও করবে।
উত্তর:
এই আপডেট হওয়া রূপটি পিএইচপি ম্যানুয়াল ব্যবহারকারী নোট # 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();
}
হাইম এভগীর উত্তরের একটি সরল সংস্করণ:
<?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);
}
}
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 = '<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.onlinephpfunitions.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>