我在使用类DOMDocument
的PHP脚本时遇到问题。我需要修复一个 HTML 文档,它带有 Span 标签中的一些元素,所以我必须更改div 的跨度,例如:
<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>
在这里我有 2 个问题:
1(第一个是类"class_6"的跨度应该是一个Div,因为它有一个子元素,但它没有替换它。
2(第二个是当它被替换为div时文本丢失,例如在div类="class_2"中消失了文本"示例2"。
我该如何解决它?
第一个是你应该将你的 for 循环更改为这个for($i=1;$i<= $element->length ;$i++)
。元素的长度(如果它们不为空(从 1 开始,而不是 0。这意味着你从 0 开始循环(什么也没发生(,在 5 处结束,因为你有 $i < $element->length
.通过更改此设置,您将从拥有第一项的 1 开始,并在 $i
等于 $element->length
时完成。
第二个,是将span
更改为div
,然后在div
内append
子项的值。通过这种方式,您可以覆盖先前span
元素的内部值。追加 span 元素的先前值 + 子元素的值作为新div 元素的追加值的附加值。
希望解决方案有所帮助!