Wie verschiebe ich inneren Inhalt mit DOMDocumentFragment?

8

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%

Beispiel

EINGABE

%Vor%

AUSGABE von moveInner($dom->getElementById('p1'))

%Vor%

AUSGABE von moveInner($dom->getElementById('b1'))

%Vor%

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.

    
Peter Krauss 17.09.2013, 12:20
quelle

2 Antworten

6

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 :

%Vor%

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:

%Vor%

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:

hakre 27.09.2013, 21:16
quelle
-3

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

    
Ivan Nikolaievskyi 25.09.2013 20:09
quelle

Tags und Links