我尝试将属性添加到html代码片段的外部标记。我准备了一些代码,但它表现得很奇怪。
用于测试的字符串有两个外部标记:div和paragraph。但只有div获得新属性。
段落正被移入div。代码有什么问题?
由于
<?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>
标记。
我尝试的方式与以前相同,但没有成功。
<?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;
答案 0 :(得分:1)
问题是你的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 );
}