2011-01-28 16 views
7

Bir belgedeki tüm <P> etiketlerini <DIV> ürününe değiştirmeye çalışıyorum. Bu ben ile geldim, ama çalışmak için görünmüyor:PHP - DOMDocument - mevcut bir HTML etiketini değiştirmek/değiştirmek için/yeni bir tane var

önce::

<p>Some text here</p> 

sonra:

İstediğim sonucudur

$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

gelen bu http://stackoverflow.com/a/21885789/175071 –

cevap

9

div, p ürününüze iliştiriyorsunuz, bu da <p><div></div></p>, p kaldırmak, her şeyi kaldıracaktır.
Ayrıca, $divnode başlatılmadığında $divnode->createElement() çalışmayacaktır.

DOMDocument::replaceChild() numaralı telefonu kullanmayı deneyin (div s pozisyonu, p s ile aynı olacaktır).

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

** Bir not çalışır: ** '$ pnode-> nodeValue' değilse Düz bir metin, ancak içinde fazladan düğümleri var, sadece metin bırakılacak (html soyulacak). –

+0

Dizin değiştikçe yinelenen öğeleri değiştiremezsiniz ve garip sonuçlarla sonuçlanırsınız. – Sanne

+2

tahmin et: Bunu gerçekten cevapladığım anda test ettim. Bu yüzden son PHP sürümünü kullanmanız durumunda foreach indeksin manipülasyonunu ele alabilir. Sanne olarak –

0

Geliştirilmiş fonksiyon 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; 
} 
İlgili konular