HTML DOM: 如何在PHP中正确使用textContent属性

3
每当我尝试访问HTML文件的DOM(我只对文本元素感兴趣)时,如果我指向节点的textContent属性,它将回显该特定节点树中的所有文本。例如:

<html lang="en">
<body>
    <p> 1st text I need</p>
    <a href="#">2nd text I need</a>
    <table>
        <tr>
            <td>3rd text I need</td>
        </tr>
    </table>
</body>
</html> 

这会产生以下结果:
#document
html
html 1st text I need 2nd text I need 3rd text I need 
body 1st text I need 2nd text I need 3rd text I need 
p 1st text I need
a 2nd text I need
table 3rd text I need 
tr 3rd text I need 
td 3rd text I need

我希望能从仅包含直接文本内容的元素中提取文本。在上面的示例中,它们将是 patd
我该如何做呢?
以下是代码(从 这里 提取):
<?php

$doc = new DOMDocument();
@$doc->loadHTMLFile('test.html');
walkDom($doc);


function walkDom($node, $level = 0)
{
$indent = '';
for ($i = 0; $i < $level; $i++)
$indent .= '  '; //prettifying the output
if($node->nodeType != XML_TEXT_NODE) {
    echo $indent .'<b>' . $node->nodeName .'</b>';
    if( $node->nodeType == XML_ELEMENT_NODE ) {
        echo $node->textContent;
    }
    echo '<br>';
}
    $cNodes = $node->childNodes;
    if (count($cNodes) > 0)
    {
        $level++; // go one level deeper
        foreach($cNodes as $cNode)
        walkDom($cNode, $level); 
        $level = $level - 1; 
    }
}
1个回答

2
您可以在DOM文档上使用XPath。"text()"返回所有文本节点。
$doc = new DOMDocument;
$doc->loadhtml('<html lang="en">
<body>
    <p> 1st text I need</p>
    <a href="#">2nd text I need</a>
    <table>
        <tr>
            <td>3rd text I need</td>
        </tr>
    </table>
</body>
</html>');
$doc->normalizeDocument();
$xpath = new DOMXpath($doc);
$results = $xpath->query("//text()");
foreach($results as $node) {
    echo trim($node->wholeText);
}

谢谢,这可以用。不过,修改那些文本元素是可能的吗?(这是我的终极目标,我忘了提到了) - Paulo Hgo
那将是一个完全不同的问题。 - miken32
1
有道理。我会提交另一个问题。感谢你的回答。 - Paulo Hgo
如果我没有看到你的问题,简短的回答是 $node->nodeValue = str_replace("this", "that", $node->wholeText); 但在某些情况下可能会更加复杂。 - miken32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接