Entfernen Sie das übergeordnete Element und behalten Sie alle inneren untergeordneten Elemente in DOMDocument mit saveHTML

8

Ich manipuliere ein kurzes HTML-Snippet mit XPath; Wenn ich das geänderte Snippet mit $ doc- & gt; saveHTML () zurückgebe, wird DOCTYPE hinzugefügt, und HTML / BODY tags umschließt die Ausgabe. Ich möchte diese entfernen, aber alle Kinder behalten, indem ich nur die DOMDocument-Funktionen verwende. Zum Beispiel:

%Vor%

Dies erzeugt:

%Vor%

Ich habe einige einfache Tricks versucht, wie zum Beispiel:

%Vor%

Bisher entfernt nur DOCTYPE und ersetzt HTML durch BODY. Was jedoch übrig bleibt, ist Körper & gt; variable Anzahl von Elementen an diesem Punkt.

Wie entferne ich das <body> -Tag, behalte aber alle seiner untergeordneten Elemente, da sie variabel strukturiert sind, auf eine saubere Art und Weise mit PHPs DOM-Manipulation?

    
pp19dd 02.05.2012, 15:20
quelle

4 Antworten

12

AKTUALISIEREN

Hier ist eine Version, die DOMDocument nicht erweitert, obwohl ich glaube, dass die Erweiterung der richtige Ansatz ist, da Sie versuchen, Funktionen zu erreichen, die nicht in die DOM-API integriert sind.

Hinweis: Ich interpretiere "sauber" und "ohne Problemumgehungen", indem ich alle Änderungen an der DOM-API behalte. Sobald Sie auf die String-Manipulation tippen, ist das ein Workaround-Gebiet.

Wie in der ursprünglichen Antwort verwende ich DOMDocumentFragment, um mehrere Knoten auf der Stammebene zu manipulieren. Es findet keine String-Manipulation statt, was für mich kein Workaround ist.

%Vor%

ORIGINAL ANTWORT

Diese Lösung ist ziemlich langwierig, aber weil sie das DOM erweitert, um Ihren Endcode so kurz wie möglich zu halten.

sliceOutNode ist der Ort, an dem die Magie passiert. Lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben:

%Vor%     
matb33 18.05.2012 18:09
quelle
10

saveHTML kann eine Teilmenge des Dokuments ausgeben, was bedeutet, dass wir sie bitten können, jeden untergeordneten Knoten einzeln auszugeben, indem wir body durchlaufen.

%Vor%

Dies ist vielleicht keine elegante Lösung, aber es funktioniert. Alternativ können wir alle untergeordneten Knoten innerhalb eines Containerelements umbrechen (z. B. div ) und nur diesen Container ausgeben (aber das Container-Tag wird in die Ausgabe eingeschlossen).

    
galymzhan 03.05.2012 04:14
quelle
2

Hier, wie ich es gemacht habe:

- Schnelle Hilfsfunktion, die Ihnen HTML-Inhalte für bestimmte DOM-Elemente bietet

%Vor%

- Suchen Sie den Body-Knoten in Ihrem Dokument und holen Sie sich den Inhalt

%Vor%

UPDATE 1:

Einige zusätzliche Informationen: Seit PHP / 5.3.6 akzeptiert DOMDocument- & gt; saveHTML () einen optionalen DOMNode-Parameter ähnlich wie DOMDocument- & gt; saveXML (). Sie können

tun %Vor%

für andere, hilft die Hilfsfunktion

    
Alexey Gerasimov 21.05.2012 18:21
quelle
-1

Sie haben zwei Möglichkeiten, dies zu erreichen:

%Vor%

Oder noch besser ist dieser Weg:

%Vor%     
Trix 04.06.2014 23:29
quelle

Tags und Links