2011-01-06 8 views
7

sagen, dass ich die folgende htmlWie kann ich XPath und DOM verwenden, um einen Knoten/Element in PHP zu ersetzen?

$html = ' 
<div class="website"> 
    <div> 
     <div id="old_div"> 
      <p>some text</p> 
      <p>some text</p> 
      <p>some text</p> 
      <p>some text</p> 
      <div class="a class"> 
       <p>some text</p> 
       <p>some text</p> 
      </div> 
     </div> 
     <div id="another_div"></div> 
    </div> 
</div> 
'; 

Und ich möchte ersetzen #old_div mit der folgenden haben:

$replacement = '<div id="new_div">this is new</div>'; 

zu geben, ein Endergebnis von:

$html = ' 
<div class="website"> 
     <div> 
      <div id="new_div">this is new</div> 
      <div id="another_div"></div> 
     </div> 
    </div> 
'; 

Gibt es eine einfache Cut-and-Paste-Funktion für das mit PHP?


Abschlussarbeits Code Dank an alle Gordon Hilfe:

<?php 

$html = <<< HTML 
<div class="website"> 
    <div> 
     <div id="old_div"> 
      <p>some text</p> 
      <p>some text</p> 
      <p>some text</p> 
      <p>some text</p> 
      <div class="a class"> 
       <p>some text</p> 
       <p>some text</p> 
      </div> 
     </div> 
     <div id="another_div"></div> 
    </div> 
</div> 
HTML; 

$dom = new DOMDocument; 
$dom->loadXml($html); // use loadHTML if it's invalid XHTML 

//create replacement 
$replacement = $dom->createDocumentFragment(); 
$replacement ->appendXML('<div id="new_div">this is new</div>'); 

//make replacement 
$xp = new DOMXPath($dom); 
$oldNode = $xp->query('//div[@id="old_div"]')->item(0); 
$oldNode->parentNode->replaceChild($replacement , $oldNode); 
//save html output 
$new_html = $dom->saveXml($dom->documentElement); 

echo $new_html; 

?> 
+1

möglich Duplikat von [Verwenden von DOMXPath zum Ersetzen eines Knotens unter Beibehaltung seiner Position ...] (http://StackOverflow.com/questions/640815/using-domxpath-to-replace-a-node-while- Aufrechterhaltung-seiner-Position) – Gordon

+1

Sie können ** XPath verwenden, um ** den Zielknoten auszuwählen, den ** durch eine DOM-Methode ersetzen soll **. Titel wird neu geschrieben. –

Antwort

11

Da die Antwort in der verknüpften Duplikat nicht so umfassend ist, werde ich ein Beispiel geben:

$dom = new DOMDocument; 
$dom->loadXml($html); // use loadHTML if its invalid (X)HTML 

// create the new element 
$newNode = $dom->createElement('div', 'this is new'); 
$newNode->setAttribute('id', 'new_div'); 

// fetch and replace the old element 
$oldNode = $dom->getElementById('old_div'); 
$oldNode->parentNode->replaceChild($newNode, $oldNode); 

// print xml 
echo $dom->saveXml($dom->documentElement); 

Technisch benötigen Sie XPath dafür nicht. Es kann jedoch vorkommen, dass Ihre Version von libxml getElementById für nicht validierte Dokumente nicht unterstützt (id attributes are special in XML). In diesem Fall ersetzen Sie den Aufruf von getElementById mit

$xp = new DOMXPath($dom); 
$oldNode = $xp->query('//div[@id="old_div"]')->item(0); 

Demo on codepad


Um eine $newNode mit untergeordneten Knoten zu erstellen, ohne dass man mit erstellen und fügen Sie Elemente nach dem anderen, können Sie tun,

$newNode = $dom->createDocumentFragment(); 
$newNode->appendXML(' 
<div id="new_div"> 
    <p>some other text</p> 
    <p>some other text</p> 
    <p>some other text</p> 
    <p>some other text</p> 
</div> 
'); 
+0

genial danke Gordon, werde es jetzt versuchen! – Haroldo

+0

@gordon 'Behebbarer fataler Fehler: Argument 2 an DOMNode übergeben :: replaceChild() muss eine Instanz von DOMNode sein, null in C: \ wamp \ www \ gv2010 \ user_area \ replacement-test.php in Zeile 24? – Haroldo

+0

@Haroldo aktualisiert. Entschuldigung, war nicht aufmerksam. – Gordon

-7

Verwenden Sie zuerst jquery hide(), um ein bestimmtes div auszublenden, und verwenden Sie dann append, um neues div anzuhängen

$('#div-id').remove(); 
$('$div-id').append(' <div id="new_div">this is new</div>'); 
+2

Eine Frage betrifft PHP (Serverseite), nicht Javascript (Clientseite). –

+3

plus, auch wenn dies auf der Client-Seite war, ist Ihre Lösung falsch, weil sie eher angehängt als ersetzt wird, so dass sie nicht beibehalten würde ... – Haroldo

Verwandte Themen