2011-01-28 3 views
7

문서의 <P> 태그를 모두 <DIV>으로 변경하려고합니다. 이것은 내가 가지고 올 한 일이지만, 작동하지 않습니다PHP - DOMDocument - 새로운 HTML 태그가있는 기존 HTML 태그를 변경/교체해야합니다.

하기 전에 :

<p>Some text here</p> 

후 :

이 내가 원하는 결과

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

<div>Some text here</div> 
+0

에서이 http://stackoverflow.com/a/21885789/175071 –

답변

9

pdiv을 추가하면 결과는입니다. 0이면 p을 제거하면 모든 것이 제거됩니다.
$divnode이 초기화되지 않은 경우 $divnode->createElement()이 작동하지 않습니다.

대신 DOMDocument::replaceChild()을 사용하십시오 (dom의 div 위치는 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; 
} 
관련 문제