【问题标题】:HTML DOM: how to properly use the textContent property with PHPHTML DOM:如何在 PHP 中正确使用 textContent 属性
【发布时间】:2017-02-04 00:13:13
【问题描述】:

每当我尝试访问 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

我想only从具有直接文本内容的元素中提取文本。在上面的示例中,它们将是 patd

我该怎么做?

代码如下(摘自here):

<?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; 
    }
}

【问题讨论】:

    标签: php html dom


    【解决方案1】:

    您可以在 DOM 文档上使用XPathtext() 返回所有文本节点。

    $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);
    }
    

    【讨论】:

    • 谢谢,这行得通。是否可以修改这些文本元素(这是我的最终目标,我忘了提及)?
    • 那将是一个完全独立的问题。
    • 公平点。我将提交另一个问题。谢谢你的回答。
    • 如果我没有看到你的问题,简短的回答是$node-&gt;nodeValue = str_replace("this", "that", $node-&gt;wholeText);,但在某些情况下可能会更复杂。
    猜你喜欢
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多