2011-01-28 3 views
7

Я пытаюсь изменить теги <P> в документе на <DIV>. Это то, что я придумал, но это не похоже на работу:PHP - DOMDocument - нужно изменить/заменить существующий тег HTML w/new

$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> 
+0

Это работает http://stackoverflow.com/a/21885789/175071 –

ответ

9

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

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

foreach($dom->getElementsByTagName("p") as $pnode) { 
    $divnode = $dom->createElement("div", $pnode->nodeValue); 
    $dom->replaceChild($divnode, $pnode); 
} 
+1

** Одно примечание: ** если '$ pnode-> nodeValue' не простой текст, но в нем есть дополнительные узлы, останется только текст (html будет удален). –

+0

Вы не можете просто заменить элементы во время итерации с тех пор, как индекс изменится, и вы получите странные результаты. – Sanne

+2

угадайте, что: я на самом деле испытал это в то время, когда я ответил. Поэтому, если вы используете недавнюю версию PHP, foreach может обрабатывать манипуляции с индексом. –

0

Улучшенная функция от this answer

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; 
}