【问题标题】:DOMDocument and hr tag losing HTMLDOMDocument 和 hr 标签丢失 HTML
【发布时间】:2018-03-20 09:04:25
【问题描述】:

使用 PHP 和 DOMDocument 类从 TinyMCE 编辑器解析 HTML。我在将 <hr /> 元素插入编辑器时遇到问题,因为 DOMDocument 不断丢失其余代码。

# Input: <hr /><p>&nbsp;</p><p>test input</p>

$domDoc = new DOMDocument();
$domDoc->loadHTML($input, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
var_dump($domDoc->saveHTML());

// Result: <hr>

我找不到任何原因,也找不到loadHTML() 的选项来防止这种情况。到底发生了什么,我可以在这里使用hr 元素吗?

【问题讨论】:

  • 当你删除 libxml 标志时它可以工作
  • 是的,但这会添加 html 包装器和正文标签,我不想要这些。
  • @Rcls 你可以自己取出那些,只需选择body标签子项并获得你想要的那些值,这是你的选择;如果你想保留标志
  • 我会试试的。谢谢!
  • 嗯,您的解决方案相当冗长。我必须单独删除 doctype、html 和 body 元素,同时保持子元素完整,或者以某种方式直接跳转到 body 子元素,在这种情况下我必须再次将 HTML 重新加载到 Domdocument?

标签: php domdocument


【解决方案1】:

答案如下:

substr($domDoc->saveHTML($domDoc->getElementsByTagName('body')->item(0)), 6, -7)

问题出在 saveHTML 中,我将 body 节点分配给该节点并解析出标签。现在我得到了完整的 HTML。这也是单线解决方案。

【讨论】:

  • 此解决方案导致了另一个问题:编码。由于某种原因,在我将节点插入 saveHTML() 作为参数后,所有斯堪的纳维亚字母都会变成垃圾。这很可能与正在创建的文档类型有关,因为如果我使用 loadHTML() 恢复选项,问题就会消失。我确实需要针对 HTML-ENTITITES 使用 mb_convert_encoding() 来将它们修复为 ISO-8859-1,但我已经放弃了。我们不会使用 HR。
【解决方案2】:

DomDocument 在遇到没有完全包裹在单个元素中的 HTML 字符串时似乎有问题。所以如果你开始:

<h1>My Title<h1><p>My text</p>

然后将其读入 DomDocument 并使用 DomDocument 对象再次生成 HTML,您将得到如下内容:

<h1>My Title<p>My text</p></h1>

对于我的应用程序,解决方案是将整个内容包装在一个 div 中,然后再将其发送到 DomDocument。这解决了 OP 发布的问题 - 如果有前导 hr 标签,将整个 html 字符串包装在 div 中将保留它和其余内容。

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多