【发布时间】:2019-11-19 22:45:33
【问题描述】:
我在使用DOMDocument 类的 PHP 脚本时遇到问题。我需要修复一个 HTML 文档,它带有 Span 标签内的一些元素,所以我必须更改 div 的 span,例如:
<span class="example1">Some text <div>whatever...</div></span>
结果应该是:
<div class="example1">Some text <div>whatever...</div></div>
我的 PHP 文件:
$html = '<html>
<head>
</head>
<body>
<span class="class_1">Example 1</span>
<span class="class_2">Example 2<span class="class_3">Example 3</span></span>
<span class="class_4">Example 4</span>
<span class="class_5">Example 5<span class="class_6">Example 6<span class="class_7">Example 7</span></span></span>
<div><span class="class_8">Example 8</span></div>
</body>
</html>';
$dom = new DOMDocument();
$dom->loadHTML($html);
$innerHTML = '';
$oldname = 'span';
$newname = 'div';
$element = $dom->getElementsByTagName($oldname);
for($i=0;$i< $element->length ;$i++){
$node = $element->item($i);
while ($node->hasChildNodes() ) {
$child = $node->childNodes->item(0);
$newTag = $child->nodeType == 1 ? $newname : $oldname;
$newNode = $node->ownerDocument->createElement($newTag);
$child = $node->ownerDocument->importNode($child, true);
$newNode->appendChild($child);
}
foreach ($node->attributes as $attr) {
$attrName = $attr->nodeName;
$attrValue = $attr->nodeValue;
$newNode->setAttribute($attrName, $attrValue);
}
$node->parentNode->replaceChild($newNode, $node);
}
$innerHTML .= $dom->saveXML();
echo $innerHTML;
输出:
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head/><body>
<span class="class_1">Example 1</span>
<div class="class_2"><span class="class_3">Example 3</span></div>
<span class="class_4">Example 4</span>
<div class="class_5"><span class="class_6">Example 6<span class="class_7">Example 7</span></span></div>
<div><span class="class_8">Example 8</span></div>
</body></html>
这里有两个问题:
1)第一个是“class_6”类的span应该是一个Div,因为它有一个子元素,但它没有替换它。
2) 第二个是文本在替换为 div 时丢失,例如在 div class= "class_2" 中,文本 "Example 2" 消失。
我该如何解决?
【问题讨论】:
标签: php dom domdocument