【问题标题】:Fix php script to replace some HTML elements using DOMDocument修复 php 脚本以使用 DOMDocument 替换一些 HTML 元素
【发布时间】: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


    【解决方案1】:

    第一个是您应该将您的 for 循环更改为 for($i=1;$i&lt;= $element-&gt;length ;$i++)。元素的长度(如果它们不为空)从 1 而不是 0 开始。这意味着您从 0 开始循环(没有任何事情发生)并且在 5 结束,因为您有 $i &lt; $element-&gt;length。通过更改此设置,您将从拥有第一个项目的 1 开始,并在 $i 等于 $element-&gt;length 时结束。

    第二个,就是你把span改成div,然后在div里面你append这个子的值。通过这种方式,您可以覆盖先前 span 元素的内部值。考虑追加span元素之前的值+child的值,作为新的div元素的追加值。

    希望该解决方案有所帮助!

    【讨论】:

    • 这看起来合乎逻辑,我试试看!
    • 之后给我们您的反馈:)
    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2015-09-16
    • 2012-10-24
    相关资源
    最近更新 更多