【问题标题】:How do I insert HTML into a PHP DOM object? [duplicate]如何将 HTML 插入 PHP DOM 对象? [复制]
【发布时间】:2011-01-16 08:15:14
【问题描述】:

我正在使用 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");

这将我所有的网站代码放在评论中,我绕过评论并手动添加&lt;body&gt;标签。

目前这种方法有效,但我相信应该有更合适的方法来做到这一点。理想情况下,像 DOM-&gt;createElement() 这样的东西不会解析任何字符串。

我也尝试过使用DOM-&gt;createDocumentFragment(),但是它不喜欢某些字符串,因此它会出错并且无法正常工作(同时会占用额外的 CPU 资源来重新解析正文的 HTML)。

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

【问题讨论】:

  • 您确定您的 HTML 是正确的吗? DOM (PHP) 和类似发明背后的想法是确保标记正确且有效,从而拒绝所有无效代码。
  • “©”之类的错误(在

    标签内)

标签: php dom


【解决方案1】:

loadHTML 工作正常。

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

输出 Hey there 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 标记中。

【讨论】:

  • 这是否允许我将 $DOM 附加到更大的 DOM 文档中?
  • 如果您问是否有两个 DOMDocument,$dom1$dom2 可以将一个添加到另一个中吗?答案是否定的,至少据我所知不是。
  • 好吧,我需要能够将我的正文代码添加到我的头部和 html DOM 对象中。
  • 可以,只要你的body code是字符串,ie。 $body = "&lt;body&gt;&lt;strong&gt;this is a message for the content of my body&lt;/strong&gt;&lt;/body&gt;" 如果这就是您所指的。如果我对某些事情有误解,请纠正我,以便我进一步帮助您。
  • 这没有回答所提出的问题。这将创建一个 HTML 文档,用户要求将 HTML 插入 domDocument
【解决方案2】:

您使用 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

【讨论】:

  • appendXML() 的遗憾是您的 HTML 必须符合 XML,但并非总是如此。恰当的例子: $frag->appendXML('") 空属性值只是其中之一问题。我最终使用了此处显示的 loadHTML/importNode 技巧:stackoverflow.com/a/39336050
【解决方案3】:

我花了很多时间研究 Anthony Forloney 的答案,但我似乎无法让 html 在不出错的情况下附加到正文。

@Mark B:我尝试过这样做,但正如我在 cmets 中所说,它在我的 html 上出错了。

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

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

【讨论】:

  • 这实际上不是一个答案,因为仅仅连接字符串太通用了。如果您对其他的不满意,则无需发布免责声明,保持原样,完全没有接受的答案,没有问题。
【解决方案4】:

我找到了解决方案,但它不是纯 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

【讨论】:

    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2022-10-14
    • 2012-02-02
    • 2011-05-23
    • 1970-01-01
    相关资源
    最近更新 更多