如何从 DOMDocument() 中的 div 中删除文本

问题描述 投票:0回答:1

我有一个 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
文本节点?

php xpath domdocument
1个回答
0
投票

这是因为您的 HTML 无效,标签不应包含

标签。

段落是独立的块:

标签表示文本块或段落。用 包裹一个段落通常会引入不必要的标记,而不会增加意义。

© www.soinside.com 2019 - 2024. All rights reserved.