将属性添加到html片段的外部标记

时间:2016-03-31 20:21:21

标签: php dom

我尝试将属性添加到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;

1 个答案:

答案 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 );
}