কীভাবে ডমনোডের অভ্যন্তরীণ এইচটিএমএল পাবেন?


98

পিএইচপি ডম বাস্তবায়নে আপনি কোনও প্রদত্ত ডোমনোডের অভ্যন্তরীণ এইচটিএমএল পাওয়ার জন্য কোন ফাংশন ব্যবহার করেন? কেউ কি নির্ভরযোগ্য সমাধান দিতে পারেন?

অবশ্যই আউটআরএইচটিএমএলও করবে।

উত্তর:


153

এই আপডেট হওয়া রূপটি পিএইচপি ম্যানুয়াল ব্যবহারকারী নোট # 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); 
} 
?> 

ধন্যবাদ এটা ভাল কাজ করে। $ Dom-> preservWhiteSpace = মিথ্যা হওয়া উচিত নয়; ডকুমেন্ট লোডের আগে হতে হবে?
দাউদ ওহিয়া


অতিরিক্ত নোট: পিএইচপি 5.3.6 থেকে আপনি অস্থায়ীভাবে ছাড়তে পারেন DOMDocument। লাইন-ব্রেকের মতো কিছুটা সাদা জায়গা রক্ষার জন্য কেউ trimএকটি ltrim(বা এমনকি এটি সম্পূর্ণ মুছে ফেলুন) দিয়ে প্রতিস্থাপন করতে চাইতে পারে ।
হ্যাক্রে

এর মতো একটি ফাংশন ডোমডোকমেন্ট ক্লাসে যুক্ত করা উচিত।
নট

4
আমি যখন ফিরতিটি দিয়ে যাচ্ছিলাম তখন DOMElementপরিবর্তে DOMNodeআমাকে তার পরিবর্তে প্রত্যাশনের জন্য ফাংশন ঘোষণাটি পরিবর্তন করতে হয়েছিল DOMDocument::getElementById()। কেবল যদি এটি অন্য কাউকে ট্রিপ করে।
miken32

26

এখানে একটি কার্যকরী প্রোগ্রামিং শৈলীর একটি সংস্করণ রয়েছে :

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

14

htmlকোনও উপাদানটির ফেরত দিতে , আপনি C14N () ব্যবহার করতে পারেন :

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

4
সি 14 এন এইচটিএমএলকে একটি বৈধ এক্সএমএলে রূপান্তর করার চেষ্টা করবে। উদাহরণস্বরূপ <br> <br> <br> হয়ে যাবে <
b

এইচটিএমএল, মাথা এবং শরীরে ট্যাগ আউটপুট আসবে বলে সেভ এইচটিএমএল ব্যবহার না করেই এটি উপাদানটির এইচটিএমএল ডাম্প করার একটি নোংরা উপায়।
পেড্রো লোবিটো

9

হাইম এভগীর উত্তরের একটি সরল সংস্করণ:

<?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

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


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>


সতর্কতা: ডোমডোকামেন্ট :: সেভ এইচটিএমএল () প্রত্যাশা 1 পরামিতিটি ডোমনোড হিসাবে দেওয়া হবে, বস্তু দেওয়া হয়েছে
ইভান গুসেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.