为什么?
根据规范,一个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();
演示