PHP - DOMDocument - необходимо изменить / заменить существующий тег HTML с новым - PullRequest
7 голосов
/ 28 января 2011

Я пытаюсь изменить все <P> теги в документе на <DIV>.Это то, что я придумал, но, похоже, это не работает:

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

foreach( $dom->getElementsByTagName("p") as $pnode ) {
    $divnode->createElement("div");
    $divnode->nodeValue = $pnode->nodeValue;
    $pnode->appendChild($divnode);
    $pnode->parentNode->removeChild($pnode);
}

Это результат, который я хочу:

До:

<p>Some text here</p>

После:

<div>Some text here</div>

Ответы [ 2 ]

9 голосов
/ 28 января 2011

Вы добавляете div к вашему p, в результате чего <p><div></div></p>, удаление p удалит все.
Кроме того, $divnode->createElement() не будет работать, если $divnode не инициализирован.

Попробуйте вместо этого использовать DOMDocument :: replaceChild () (позиция div в dom будет такой же, как и p s).

foreach( $dom->getElementsByTagName("p") as $pnode ) {
    $divnode = $dom->createElement("div", $pnode->nodeValue);
    $dom->replaceChild($divnode, $pnode);
}
0 голосов
/ 07 октября 2016

Расширенные функции от этот ответ

function changeTagName( $node, $name ) {
    $childnodes = array();
    foreach ( $node->childNodes as $child ) {
        $childnodes[] = $child;
    }
    $newnode = $node->ownerDocument->createElement( $name );
    foreach ( $childnodes as $child ){
        $child2 = $node->ownerDocument->importNode( $child, true );
        $newnode->appendChild($child2);
    }
    if ( $node->hasAttributes() ) {
        foreach ( $node->attributes as $attr ) {
            $attrName = $attr->nodeName;
            $attrValue = $attr->nodeValue;
            $newnode->setAttribute($attrName, $attrValue);
        }
    }
    $node->parentNode->replaceChild( $newnode, $node );
    return $newnode;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...