我有一个 html 字符串,其中包含一些 div 中的文本。我需要从 div 中提取该文本。 (出于好奇,当用户复制/粘贴到可内容编辑的 div 中时,这些额外的 div 就会出现)
开始 html:
<div>
Text1
<div>
<p>para</p>
Text2
</div>
<div>
Text3
</div>
</div>
我想要的 HTML 是:
<div>
Text1
<p>para</p>
Text2
Text3
</div>
我的计划是使用 xpath 查找所有内部 div 并将其内容“提升”到文档中。
$doc = new DOMDocument();
$doc->loadHTML("<div>Text1<div><p>para</p>Text2</div><div>Text3</div></div>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);
foreach ($xpath->evaluate('/div/div[not(@*)]') as $node) {
$frag = $doc->createDocumentFragment();
foreach ($node->childNodes as $child) {
$frag->appendChild($child);
}
node->replaceWith($frag);
};
这种方法可行,但它会与包含文本和其他 html 的 div 混淆。结果是:
<div>Text1<p>para</p>Text3</div>
为什么缺少
Text2
文本节点?
这是因为您的 HTML 无效,标签不应包含
标签。
段落是独立的块:
标签表示文本块或段落。用 包裹一个段落通常会引入不必要的标记,而不会增加意义。