Изменить внешний HTML элемента php DOMElement? - PullRequest
0 голосов
/ 28 апреля 2020

Как изменить внешний Html элемента с помощью PHP класса DomDocument? Убедитесь, что не используются сторонние библиотеки, такие как Simple PHP Dom или др.

Например: я хочу сделать что-то подобное.

$dom = new DOMDocument;
$dom->loadHTML($html);  
$tag = $dom->getElementsByTagName('h3');
foreach ($tag as $e) {
 $e->outerHTML = '<h5>Hello World</h5>';
}

libxml_clear_errors();
$html = $dom->saveHTML();
echo $html;

И вывод должен быть как это:

Old Output: <h3>Hello World</h3>
But I need this new output: <p>Hello World</p>

1 Ответ

1 голос
/ 28 апреля 2020

Вы можете создать копию содержимого и атрибутов элемента в новом узле (с новым нужным вам именем) и использовать функцию replaceChild().

Текущий код будет работать только с простыми элементами (текст внутри узла), если у вас есть вложенные элементы, вам нужно написать рекурсивную функцию.

$dom = new DOMDocument;
$dom->loadHTML($html);  

$titles = $dom->getElementsByTagName('h3');
for($i = $titles->length-1 ; $i >= 0 ; $i--)
{
    $title = $titles->item($i);
    $titleText = $title->textContent ; // get original content of the node

    $newTitle = $dom->createElement('h5'); // create a new node with the correct name
    $newTitle->textContent = $titleText ; // copy the content of the original node

    // copy the attribute (class, style, ...)
    $attributes = $title->attributes ;
    for($j = $attributes->length-1 ; $j>= 0 ; --$j)
    {
        $attributeName = $attributes->item($j)->nodeName ;
        $attributeValue = $attributes->item($j)->nodeValue ;

        $newAttribute = $dom->createAttribute($attributeName);
        $newAttribute->nodeValue = $attributeValue ;

        $newTitle->appendChild($newAttribute);
    }


    $title->parentNode->replaceChild($newTitle, $title); // replace original node per our copy
}


libxml_clear_errors();
$html = $dom->saveHTML();
echo $html;
...