Php 为什么xpath会改变HTML?

Php 为什么xpath会改变HTML?,php,xpath,Php,Xpath,这是我的密码: $html\u string=nodeName!=“src”&&$node->nodeName!=“href”&&$node->nodeName!=“alt”){ $node->parentNode->removeAttribute($node->nodeName); } } echo$dom->saveHTML(); 正如您在演示中看到的,在输出中的位置不正确。我的意思是它的位置已经改变了。为什么?如何解决这个问题?每个DOMDocument都需要一个根节点。对于HTML文档

这是我的密码:

$html\u string=nodeName!=“src”&&$node->nodeName!=“href”&&$node->nodeName!=“alt”){
$node->parentNode->removeAttribute($node->nodeName);
}
}
echo$dom->saveHTML();

正如您在演示中看到的,

在输出中的位置不正确。我的意思是它的位置已经改变了。为什么?如何解决这个问题?

每个DOMDocument都需要一个根节点。对于HTML文档,它通常是
节点

因为根节点是必需的,所以在您的例子中,libXML将第一个节点,即您的
p
元素,作为根节点
这就是为什么下一个节点
div[@class=“myclass”]
$dom->saveHTML()一起成为
p
元素的子节点

将代码包装在根节点中,如
,以解决问题

$html_string = <<<STR
<html>
<p>paragraph<a>link</a></p>
<div class="myclass">
    <div>something</div>
    <div style="mystyle">something</div>
    <b><a href="#">link</a></b>
    <b><a href="#" name="a name">link</a></b>
    <b style="color:red">bold</b>
    <img src="../path" alt="something" />
    <img src="../path" alt="something" class="myclass" />
</div>
</html>
STR;

$dom = new DOMDocument;
$dom->loadHTML(mb_convert_encoding($html_string, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//@*');
foreach ($nodes as $node) {             
    if($node->nodeName != "src" && $node->nodeName != "href" && $node->nodeName != "alt") {
        $node->parentNode->removeAttribute($node->nodeName);
    }
}

echo $dom->saveHTML(); 
$html\u string=nodeName!=“src”&&$node->nodeName!=“href”&&$node->nodeName!=“alt”){
$node->parentNode->removeAttribute($node->nodeName);
}
}
echo$dom->saveHTML();

是的,很有效,谢谢你,upvote。。!你能告诉我为什么我需要
标签围绕它吗?我很高兴我的答案很有用。我只是编辑它来告诉你背后的原因。简而言之:DOMDocument必须有根节点。
$html_string = <<<STR
<html>
<p>paragraph<a>link</a></p>
<div class="myclass">
    <div>something</div>
    <div style="mystyle">something</div>
    <b><a href="#">link</a></b>
    <b><a href="#" name="a name">link</a></b>
    <b style="color:red">bold</b>
    <img src="../path" alt="something" />
    <img src="../path" alt="something" class="myclass" />
</div>
</html>
STR;

$dom = new DOMDocument;
$dom->loadHTML(mb_convert_encoding($html_string, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//@*');
foreach ($nodes as $node) {             
    if($node->nodeName != "src" && $node->nodeName != "href" && $node->nodeName != "alt") {
        $node->parentNode->removeAttribute($node->nodeName);
    }
}

echo $dom->saveHTML();