Php 如何将类设置为特定块内的所有文本节点父节点

Php 如何将类设置为特定块内的所有文本节点父节点,php,domdocument,Php,Domdocument,我需要将一个类设置为页面上特定块内每个文本节点的父节点 以下是我想做的: $pageHTML = '<html><head></head> <body> <header> <div> <nav>Menu</nav> <span>Another text</span> </div> </header> <section&g

我需要将一个类设置为页面上特定块内每个文本节点的父节点

以下是我想做的:

$pageHTML = '<html><head></head>
<body>

<header>
  <div>
    <nav>Menu</nav>
    <span>Another text</span>
  </div>
</header>

<section>Section</section>
<footer>Footer</footer>
</body>
</html>';

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($pageHTML);
libxml_use_internal_errors(false);

foreach($dom->getElementsByTagName('body')[0]->childNodes as $bodyChild) {

    if($bodyChild->nodeName == 'header') {

        $blockDoc = new DOMDocument();
        $blockDoc->appendChild($blockDoc->importNode($bodyChild, true));
        $xpath = new DOMXpath($blockDoc);

        foreach($xpath->query('//text()') as $textnode) {
            if(preg_match('/\S/', $textnode->nodeValue)) { // exclude non-characters
                 $textnode->parentNode->setAttribute('class','my_class');
            }
        }
    }
}

echo $dom->saveHTML((new \DOMXPath($dom))->query('/')->item(0));
$pageHTML=
菜单
另一个文本
部分
页脚
';
$dom=新的DOMDocument;
libxml\u使用\u内部错误(true);
$dom->loadHTML($pageHTML);
libxml\u使用\u内部错误(false);
foreach($dom->getElementsByTagName('body')[0]->childNodes作为$bodyChild){
如果($bodyChild->nodeName=='header'){
$blockDoc=新的DOMDocument();
$blockDoc->appendChild($blockDoc->importNode($bodyChild,true));
$xpath=newdomxpath($blockDoc);
foreach($xpath->query('//text()')作为$textnode){
如果(preg_match('/\S/',$textnode->nodeValue)){//排除非字符
$textnode->parentNode->setAttribute('class','my_class');
}
}
}
}
echo$dom->saveHTML((新建\DOMXPath($dom))->查询('/')->项(0));
我需要用
我的
获取
内部的
,但我没有获取


正如我所理解的,在将类设置为更改后,我需要将更改后的父节点返回到DOM,但我如何才能做到这一点?

试试这段代码,您必须使用按名称获取节点,而不是按文本节点进行检查

$pageHTML = '<html>
<head></head>
<body>

<header>
  <div>
    <nav>Menu</nav>
    <span>Another text</span>
  </div>
</header>

<section>Section</section>
<footer>Footer</footer>
</body>
</html>';

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($pageHTML);
libxml_use_internal_errors(false);

$elements = $dom->getElementsByTagName('header');
foreach ($elements as $node) {
    $nav = $node->getElementsByTagName('nav');
    $span = $node->getElementsByTagName('span');

    $nav->item(0)->setAttribute('class', 'my_class');
    $span->item(0)->setAttribute('class', 'my_class');
 }

echo $dom->saveHTML();
$pageHTML=
菜单
另一个文本
部分
页脚
';
$dom=新的DOMDocument;
libxml\u使用\u内部错误(true);
$dom->loadHTML($pageHTML);
libxml\u使用\u内部错误(false);
$elements=$dom->getElementsByTagName('header');
foreach($元素作为$node){
$nav=$node->getElementsByTagName('nav');
$span=$node->getElementsByTagName('span');
$nav->item(0)->setAttribute('class','my_class');
$span->item(0)->setAttribute('class','my_class');
}
echo$dom->saveHTML();

好的,我自己找到了答案:

...
$xpath = new DOMXpath($dom);

foreach($dom->getElementsByTagName('body')[0]->childNodes as $bodyChild) {

    if($bodyChild->nodeName == 'header') {

        foreach($xpath->query('.//text()', $bodyChild) as $textnode) {

            if(preg_match('/\S/', $textnode->nodeValue)) { // exclude non-characters
                $textnode->parentNode->setAttribute('class','my_class');
            }
        }
    }
}

您的意思是像这样使用xpath并将类添加到div的子类中吗?谢谢,但是可能会有不同的条件,不仅仅是通过标签名。我需要得到文本节点,不管它们的父标记是什么,也不知道它们的父标记。这只是我问题中的一个例子。看看我自己的答案