如何在不删除其childNodes的情况下更改节点的textValue

时间:2018-03-28 18:17:50

标签: php dom

想象一下这个HTML:

<html>
      <head><title>Nice page</title></head>
      <body>Hello World <a href=http://google.com>This is a link</a>
            <br />
            <a href=http://www.google.com> this also
                <img src=wrong.image> and here
            </a>
     </body>
</html>

当我尝试用大写字母输入链接的所有文本时,它会删除链接标记的img标记。

<html>
       <head><title>Nice page</title></head>
       <body>Hello World <a href=http://google.com>THIS IS A LINK</a>
            <br />
            <a href=http://www.google.com> THIS ALSO AND HERE</a>
      </body>
</html>

这是我使用的PHP:

libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTMLFile("index.html");
$elements = $doc->getElementsByTagName("a");
foreach($elements as $elem)
{
    $elem->nodeValue = strtoupper($elem->nodeValue);
}
echo $doc->saveHTML();

我如何保护孩子?

1 个答案:

答案 0 :(得分:2)

您可以使用xpath查询专门获取链接中的文本节点。

libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTMLFile("example.html");

$xpath = new DOMXPath($doc);
$linkTextNodes = $xpath->query('//a/descendant::text()');
foreach ($linkTextNodes as $node) {
    $node->textContent = strtoupper($node->textContent);
}
echo $doc->saveHTML();