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


Add attributes to outer tags of html fragments

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