我尝试将属性添加到html代码片段的外部标记中。我准备了一些代码,但它的行为很奇怪。
用于测试的字符串有两个外部标记:div和paragraph。但是只有div获得新属性。
段落被移到div中。代码中有什么错误?
感谢
https://ideone.com/6Fu2zy
<?php
$html = '
<div>
<a>
<h1>Article 02</h1>
</a>
<img src="abc.jpg">
</div>
<p>
<span>dsaf</span>
</p>';
$dom = new DOMDocument();
@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$x = new DOMXPath($dom);
foreach ($x->query("/*") as $node) {
$node->setAttribute("style", "xxxx");
}
$newHtml = $dom->saveHtml();
echo $newHtml;
编辑:
因此,我可以将节点放入<root>
标记中,然后添加属性。但我不知道如何做到这一点,所以我只留下了外部<html>
和<body>
标签。
添加属性成功,但我不知道如何从代码中删除外部<html>
和<body>
标记。
我比以前试过同样的方法,但没有成功。
https://ideone.com/6Fu2zy
<?php
$html = '
<div>
<a>
<h1>Article 02</h1>
</a>
<img src="abc.jpg">
</div>
<p>
<span>dsaf</span>
</p>';
$dom = new DOMDocument();
@$dom->loadHTML($html, LIBXML_HTML_NODEFDTD);
$x = new DOMXPath($dom);
foreach ($x->query("/html/body/*") as $node) {
$node->setAttribute("style", "xxxx");
}
$newHtml = @$dom->saveHtml();
@$dom->loadHTML($newHtml, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$newHtml2 = @$dom->saveHtml();
echo $newHtml2;
问题是HTML没有根元素,所以DOMDocument
将第一个元素(<div>
)转换为所有其他节点的包装器。
您的:
<div>
<a><h1>Article 02</h1></a>
<img src="abc.jpg">
</div>
<p><span>dsaf</span></p>
DOMDocument
加载为:
<div>
<a><h1>Article 02</h1></a>
<img src="abc.jpg">
<p><span>dsaf</span></p>
</div>
因此,/*
模式仅返回一个节点。
在HTML中添加根元素:
<root>
<div>
<a><h1>Article 02</h1></a>
<img src="abc.jpg">
</div>
<p><span>dsaf</span></p>
</root>
然后使用这个路径:
/root/*
在转换之后,如果您只需要输出内部HTML,不幸的是DOMDocument
没有这个功能。你可以这样做:
$innerHTML = "";
foreach( $dom->getElementsByTagName( 'root' )->item(0)->childNodes as $child )
{
$innerHTML .= $dom->saveHTML( $child );
}