Исправлен php скрипт для замены некоторых элементов HTML с использованием DOMDocument - PullRequest
1 голос
/ 10 июля 2019

У меня проблема с PHP-скриптом, использующим класс DOMDocument.Мне нужно исправить 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 "class_6" должен быть Div, потому что он имеет дочерний элемент, но он не заменяет его.

2) Второй - текст отсутствует при его замене на div, например, в div class =«class_2» пропал текст «Пример 2».

Как я могу это исправить?

1 Ответ

0 голосов
/ 10 июля 2019

Во-первых, вы должны изменить свой цикл for на for($i=1;$i<= $element->length ;$i++). Длина элементов (если они не пустые) начинается с 1, а не с 0. Это означает, что вы начинаете свой цикл с 0 (где ничего не происходит) и заканчиваете с 5, потому что у вас есть $i < $element->length. Изменяя это, вы начнете с 1, где у вас есть первый элемент, и закончите, когда $i будет равно $element->length.

Во-вторых, вы изменяете span на div, а затем в div you append значение ребенка. Таким образом, вы переопределяете внутреннее значение вашего ранее span элемента. Консиндер добавления предыдущего значения элемента span + значения дочернего элемента в качестве значения добавления нового элемента div.

Надеюсь, что решение поможет!

...