Ich habe einen schrecklichen Algorithmus, um "einen Knoten zu entfernen" und seinen inneren Inhalt auf seinen Elternknoten zu verschieben (siehe unten) ... Aber Ich denke, dass es möglich ist, einen besseren Algorithmus zu entwickeln, indem DOMDocumentFragment (und nicht saveXML / loadXML verwenden) .
Der folgende Algorithmus wurde von renameNode () inspiriert.
%Vor%EINGABE
%Vor% AUSGABE von moveInner($dom->getElementById('p1'))
AUSGABE von moveInner($dom->getElementById('b1'))
Es gibt keine Änderungen in moveInner($dom->getElementById('root'))
oder moveInner($dom->getElementById('p1'))
nach der ersten Verwendung.
PS: ist wie eine "TRIM TAG" -Funktion.
Wenn Sie sich im selben Dokument bewegen, ist das bei weitem nicht so viel Aufwand. Der Code, den du alleine gepostet hast, hat bereits viele Orte, die nur für dich selbst optimiert werden können. Um zum Beispiel ein childNodes
NodeList
in ein Array zu verwandeln, benutze einfach iterator_to_array
:
Auch sollten Sie mehr sprechende Variablennamen verwenden, es gibt kein Problem, längere Namen zu haben. Es macht den Code einfach lesbarer und lässt den Raum, um die wichtigeren Dinge schneller zu sehen:
%Vor%Es funktioniert einfach. Wenn Sie das selbe -Element an einer anderen Stelle in DOMDocument einfügen, wird das Element verschoben, nicht dupliziert.
Wenn du duplizieren willst (um das Kind zu erhalten, es nicht zu verschieben), kannst du die Kindknoten als Prototypen benutzen und sie einfach klonen. Da diese Funktion das entfernte Element zurückgibt, enthält es die Kopie.
Zuerst das Beispiel ohne Klon, nur die Funktion wie oben:
%Vor%Ausgabe:
%Vor% Dann als zweites die modifizierte Funktion, die Änderung fügt nur clone
in der folgenden Zeile hinzu:
Ausgabe:
%Vor%Ich hoffe, das ist hilfreich und entspricht Ihren Bedürfnissen. Sie hatten wirklich sehr viel Code dort, wahrscheinlich ein bisschen irreführend durch das Replace-Node-Szenario, das anders ist. Auch in diesem Szenario habe ich einen anderen Fehlercode gepatcht, der nicht immer die beste Basis ist, um in guten Code zu wechseln.
Das übrigens. erinnerte mich an eine Frage, wo Klon war auch sehr hilfreich, die ich gerade heute beantwortet habe:
Sie können versuchen, phpQuery für diese Aufgabe zu verwenden. Es hat eine ähnliche Syntax wie die jQuery.
So etwas wie pq("#b1")->html(pq("#b1")->text());
Link zu phpQuery
Tags und Links php innerhtml domdocument