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();