php - PHP XPath - 将 HTML 内容分解为节点(包括空节点)
问题描述
我正在尝试将 HTML 字符串分解为带有文本内容的单个节点(如果为空则不分解)。
这是我拥有的 HTML 字符串:
<p>Paragraph one.</p>
<p><strong>Paragraph <em>two</em></strong>.</p>
<p>Some <strong>other paragraph</strong> three.</p>
<p>Last paragraph - paragraph four.</p>
<table>
<tbody>
<tr>
<td>Table paragraph one</td>
<td>Table paragraph two</td>
</tr>
<tr>
<td></td>
<td>Table paragraph four</td>
</tr>
</tbody>
</table>
我目前拥有的代码几乎达到了我想要的效果:
$document = new DOMDocument();
$document->loadXML('<div class="root">'.$content.'</div>');
$xpath = new DOMXpath($document);
$nodes = $xpath->evaluate('//text()');
foreach($nodes as $node) {
echo $node->getNodePath();
echo '<br>';
echo $node->textContent;
echo '<hr>';
}
但它不会包括空节点,比如这个表格单元格(下面的结果 - tr[2]/td[1] 不在列表中)。如何强制它包含没有任何#text 的空节点,并且不创建重复项?
当前结果:
/div/p[1]/text()
Paragraph one.
/div/p[2]/strong/text()
Paragraph
/div/p[2]/strong/em/text()
two
/div/p[2]/text()
.
/div/p[3]/text()[1]
Some
/div/p[3]/strong/text()
other paragraph
/div/p[3]/text()[2]
three.
/div/p[4]/text()
Last paragraph - paragraph four.
/div/table/tbody/tr[1]/td[1]/text()
Table paragraph one
/div/table/tbody/tr[1]/td[2]/text()
Table paragraph two
/div/table/tbody/tr[2]/td[2]/text()
Table paragraph four
如您所见,不包括空节点。我如何包括它们?谢谢。
解决方案
这个版本$nodes
应该让你足够接近,虽然不完全是,你的预期输出:
$nodes =$xpath->evaluate("//text() | //*[not(text())]");
推荐阅读
- r - 如何在 ggplot ( R studio) 中选择饼图的顺序
- firebase - 颤振代码是否可以通过以下方式填充云火库?
- java - 无法使用 Cucumber 和 TestNG 在 xml 文件上传递参数
- javascript - JavaScript 中的模态图像问题
- sockets - linux服务器连接超时问题
- r - 选择数据集的列而不使用列的编号而是列的名称
- excel - Power Query 中的重叠时间序列数据
- oracle - 如果页面项具有特定值,则 Oracle 顶点重定向页面
- javascript - 如何使用本地表列和外键表中存在的列创建 sequelize 复合约束
- text - 谷歌云语音转文本支持任何浏览器?这适用于 Safari 吗?