0

我有一个如下的 HTML:

<pre>
  <code>
   some code
   <div></div>
  </code>
  <ul>
     <li>1</li>
  </ul>
</pre>
others

并通过 DOMDocument 解析它。

在我运行这个之后:

$doc = new DOMDocument();
$doc->loadHTML($html);
echo $doc->saveHTML();

ul元素已从元素中删除pre

<pre>
  <code>
   some code
   <div></div>
  </code>
</pre>
<ul>
 <li>1</li>
</ul>
others

为什么以及如何保持不变?

详情请看demo

4

1 回答 1

0

为什么?

根据规范,一个UL元素不能属于一个PRE元素的内容。

允许的内容:短语内容

短语内容是流内容的子集,它定义了文本及其包含的标记,并且可以在任何需要流内容的地方使用。短语内容的运行构成段落。

属于这一类的元素有 <abbr>、<audio>、<b>、<bdo>、<br>、<button>、<canvas>、<cite>、<code>、<command>、<data>、 <datalist>、<dfn>、<em>、<embed>、<i>、<iframe>、<img>、<input>、<kbd>、<keygen>、<label>、<mark>、<math >, <meter>, <noscript>, <object>, <output>, <picture>, <progress>, <q>, <ruby>, <samp>, <script>, <select>, <small>, <span>、<strong>、<sub>、<sup>、<svg>、<textarea>、<time>、<u>、<var>、<video>、<wbr> 和纯文本(不仅包括空格字符)。

这可以在调用后的警告消息中看到$doc->loadHTML($html)

警告:DOMDocument::loadHTML(): Unexpected end tag : pre in Entity

演示

如何保持不变?

如果您仍然需要只处理不符合规范的 DOM 结构片段,请使用createDocumentFragmentandappendXML函数:

$doc = new DOMDocument();
$docFragment = $doc->createDocumentFragment();
$docFragment->appendXML($html);
$doc->appendChild($docFragment);
echo $doc->saveHTML();

演示

于 2021-10-27T04:01:43.203 回答