如何将HTML插入PHP DOM对象?

时间:2010-02-12 21:14:04

标签: php dom

我正在使用PHP的DOM对象为我的网站创建HTML页面。这对我的头很有用,但是因为我会在身体中输入大量的HTML(不是通过DOM),我认为我需要使用DOM->createElement($bodyHTML)将我的HTML从我的网站添加到DOM对象。

然而,DOM->createElement似乎解析了所有HTML实体,因此我的最终结果最终在页面上显示HTML而不是实际呈现HTML。

我目前正在使用hack来实现此功能,

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

将我的所有网站代码放入评论中,我在评论中绕过并手动添加<body>代码。

目前这种方法有效,但我相信应该有更合适的方法。理想情况下,DOM->createElement()之类的东西不会解析任何字符串。

我也尝试使用DOM->createDocumentFragment()然而它不喜欢某些字符串,所以它会出错并且不起作用(除了占用额外的CPU能力来重新解析正文的HTML)。

所以,我的问题是,除了使用DOM->createComment()之外,还有更好的方法吗?

4 个答案:

答案 0 :(得分:14)

使用DOMDocumentFragment对象将任意HTML块插入另一个文档。

$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

答案 1 :(得分:2)

我找到了解决方案,但它不是纯粹的PHP解决方案,但效果非常好。对于每个像我一样失去无数个小时的人来说,要解决这个问题

$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

答案 2 :(得分:0)

loadHTML效果很好。

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

以红色输出嘿那里有mrlanrat!

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

哪个输出:

这是一个正文,一个很好的正文,我可以添加并在你的HTML源代码中,它包含在body标签内。

答案 3 :(得分:-2)

我花了很多时间研究Anthony Forloney的答案,但我似乎无法将html附加到身体而不会出错。

@Mark B:我已经尝试过这样做,但正如我在评论中所说,它在我的HTML上出错了。

我忘记添加以下内容,我的解决方案:

我决定让我的html对象更简单,并且允许我通过不使用DOM而只使用字符串来做到这一点。