首页 > 解决方案 > 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

如您所见,不包括空节点。我如何包括它们?谢谢。

标签: phphtmlxmlxpathdomdocument

解决方案


这个版本$nodes应该让你足够接近,虽然不完全是,你的预期输出:

$nodes =$xpath->evaluate("//text() | //*[not(text())]");

推荐阅读