Nasıl bir PHP DOM nesnesi HTML içine ekleyebilirim?

4 Cevap php

Benim web sitesi için HTML sayfaları oluşturmak için PHP'nin DOM nesnesi kullanıyorum. Bu benim (değil DOM üzerinden) vücuda HTML bir sürü giriyor olacak, ancak bu yana kafama için harika çalışıyor, ben benim siteden benim HTML eklemek için DOM->createElement($bodyHTML) kullanmak gerekir düşünürdüm DOM nesnesi.

Ancak DOM->createElement Benim sonuç sayfasındaki HTML görüntülemek sona erdi ve gerçek HTML işler tüm HTML öğelerini ayrıştırmak gibi görünüyor.

Ben şu anda bu işe almak için bir hack kullanıyorum,

$body = $this->DOM
             ->createComment('DOM Glitch--><body>'.$bodyHTML."</body><!--Woot");

Hangi Ben athe Yorum bypass ve manuel <body> etiketleri eklemek hangi bir açıklamada tüm site kodu koyar.

Şu anda bu yöntem çalışır, ama bunu yapmanın daha doğru bir yol olması gerektiğine inanıyoruz. İdeal gibi bir şey DOM->createElement() bu dize herhangi ayrıştırmak değildir.

Ben de DOM->createDocumentFragment() Ancak o hata bu yüzden bazı dize gibi değil (yeniden ayrıştırmak vücudun HTML için ekstra CPU gücü kadar sürebilir ile birlikte) çalışmaz kullanarak çalıştı.

Yani, benim soru kullanarak daha bu diğer yapmanın daha iyi bir yolu yoktur DOM->createComment()?

4 Cevap

Ben Anthony Forloney cevabı üzerinde çalışan çok zaman geçirdim, Ama erroring olmadan vücuda eklemek için html almak gibi olamaz.

@ Mark B: Ben bunu yaparken denedim, ama ben açıklamalarda söylediği gibi, benim html beklemedeki faturalar, hatalı.

Ben aşağıda, benim çözüm eklemeyi unutmuş:

Ben html nesne çok daha basit hale getirmek ve beni DOM kullanarak değil bunu sadece dizeleri kullanmak için izin verdi.

Başka bir belgeye keyfi HTML parçaları eklemek için DOMDocumentFragment objec kullanın.

$dom = new DOMDocument();
@$dom->loadHTML($some_html_document); // @ to suppress a bajillion parse errors

$frag = $dom->createDocumentFragment(); // create fragment
$frag->appendXML($some_other_html_snippet); // insert arbitary html into the fragment

$node = // some operations to find whatever node you want to insert the fragment into

$node->appendChild($frag); // stuff the fragment into the original tree

loadHTML gayet güzel çalışıyveya.

<?php
$dom = new DOMDocument();
$dom->loadHTML("<font colveya='red'>Hey there mrlanrat!</font>");
echo $dom->saveHTML();
?>

hangi çıkışları Hey there mrlanrat! kırmızı.

veya

<?php
$dom = new DOMDocument();
$bodyHTML = "here is the body, a nice body I might add";
$dom->loadHTML("<body> " . $bodyHTML . " </body>");
// this would even wveyak as well.
// $bodyHTML = "<body>here is the body, a nice body I might add</body>";
// $dom->loadHTML($bodyHTML);
echo $dom->saveHTML();
?>

Hangi çıkışlar:

here is the body, a nice body I might add ve HTML kaynak kodunun içinde, kendi iç body etiketleri tamamladı.

Ben ÇÖZÜM BULUNAMADI ama saf php çözüm değil, ama çok iyi çalışıyor. Sayısız saatler kayıp herkes için küçük bir hack, benim gibi, bu sorunu gidermek için

$dom = new DomDocument;
// main object
$object = $dom->createElement('div');

// html attribute
$attr = $dom->createAttribute('value');
// ugly html string
$attr->value = "<div>&nbsp; this is a really html string &copy;</div><i></i> with all the &copy; that XML hates!";
$object->appendChild($attr);

// jquery fix (or javascript as well)
$('div').html($(this).attr('value')); // and it works! 
$('div').removeAttr('value'); // to clean-up