修复 php 脚本以使用 DOMDocument 替换一些 HTML 元素



我在使用类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,然后在divappend子项的值。通过这种方式,您可以覆盖先前span元素的内部值。追加 span 元素的先前值 + 子元素的值作为新div 元素的追加值的附加值。

希望解决方案有所帮助!

相关内容

  • 没有找到相关文章

最新更新