Wie kann ich mithilfe von XPath-und DOM-zum ersetzen eines Knoten/element in php?
Sagen, ich habe den folgenden 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>
';
Und ich möchte Sie ersetzen #old_div
mit den folgenden:
$replacement = '<div id="new_div">this is new</div>';
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, dies zu tun mit PHP?
Endgültige code Dank an alle Gordon ' s 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;
?>
- möglich, Duplikat der Mit DOMXPath zu ersetzen, einen Knoten unter Beibehaltung seiner position ...
- Sie können XPath zur Auswahl der Ziel-Knoten zu ersetzen mit einer DOM-Methode. Refrasing Titel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da die Antwort in der verlinkten duplizieren ist nicht, dass die umfassende, werde ich ein Beispiel geben:
Technisch, brauchen Sie nicht, XPath für diesen. Allerdings kann es vorkommen, dass Ihre version von libxml nicht
getElementById
für nicht-validierte Dokumente (id-Attribute werden in speziellen XML). In diesem Fall, ersetzen Sie den AufrufgetElementById
mitDemo auf codepad
Erstellen
$newNode
mit untergeordneten Knoten, die zimmerreserviereung, ohne das Sie zum erstellen und anfügen von Elementen eins nach dem anderen, die Sie tun können,$replacement
html ist sehr viel komplexer als nur einen einzigen Knoten. Gibt es eine Möglichkeit einen string (heredoc) für die$newNode
?jquery-hide() zuerst zu verstecken, insbesondere div und dann verwenden Sie append zum anfügen neuer div