Doppelte HTML-Tags entfernen
Stefan
- php
Hallo,
wie kann ich aus folgendem HTML-Code mit PHP (z.Bsp. preg_replace) die doppelten HTML-Elemente entfernen?
Beispiel:
<div><div><div><div><div>irgendein inhalt</div></div></div> und es geht <div>hier</div> auch noch <div><div>weiter</div> und weiter</div></div></div>
Da soll im Idealfall dann stehen:
<div>irgendein inhalt</div> und es geht <div>hier</div> auch noch <div><div>weiter</div> und weiter</div>
Wenn also vor einem Inhalt mehrere div-Bereiche beginnen und nach dem Inhalte mehrere aufhören, dann soll nur noch einer davor beginnen und danach enden.
<div><div>(.*)</div></div>
wird zu <div>$1</div>
- nur wie schreibe ich es richtig? Leider sind meine bisherigen Versuche da alle gescheitert 😟
Danke und Viele Grüße, Stefan
Hello,
wenn es kein Einzelfall ist, dann bastele dir etwas mit dem DOM-Document-Parser von PHP. Damit ist sowas sehr sauber möglich.
Liebe Grüße
Tom S.
Lieber TS,
Die Krawatte ist das Kopftuch des Westens
was ist denn das für ein Unsinn?
Liebe Grüße,
Felix Riesterer.
Geht's nur um div oder um beliebige Tags?
Rolf
Hallo Rolf,
geht nur um div-Elemente, lese die Inhalte von woanders ein und kann an der Quelle nichts ändern. Da ist jetzt eine ordentliche div-Suppe, die ich bereinigen will.
Idee: Den String von vorne und von hinten durchsuchen nach Paaren von <div><div>...</div></div>
Wenn zwei ohne Werte dazwischen aufeinander folgen, dann zu einem machen
'<div><div><div><div><div>irgendein inhalt</div></div></div> und es geht <div>hier</div> auch noch <div><div>weiter</div> und weiter</div></div></div>'
'<div><div><div><div>irgendein inhalt</div></div></div> und es geht <div>hier</div> auch noch <div><div>weiter</div> und weiter**</div></div>**'
'<div><div><div>irgendein inhalt</div></div></div> und es geht <div>hier</div> auch noch <div><div>weiter</div> und weiter</div>'
'<div><div>irgendein inhalt</div></div> und es geht <div>hier</div> auch noch <div><div>weiter</div> und weiter</div>'
'<div>irgendein inhalt</div> und es geht <div>hier</div> auch noch <div><div>weiter</div> und weiter</div>'
fertich.
Hallo Linuchs,
Idee: Den String von vorne und von hinten durchsuchen nach Paaren von <div><div>...</div></div>
Ja, ich denke, das ist eine gute Idee. Man sollte noch berücksichtigen, dass whitespace dazwischen sein kann.
Bis demnächst
Matthias
Was ist, wenn was anderes, nicht gerendertes, dazwischen ist, z.B. Kommentar? DIV-Suppe ist's dann immer noch, aber der Kommentar verhindert die Erkennung.
Unabhängig davon - kann man das nicht Regexen?
Edit: Nein kann man nicht - ist Unsinn. Siehe TS' Hinweis
Rolf
Hello,
Idee: Den String von vorne und von hinten durchsuchen nach Paaren von <div><div>...</div></div>
Das klappt leider nicht, ohne die Struktur zu parsen. Man weiß sonst nicht, welche öffnenden und welche schließenden <div>-Tags zusammengehören und auch nicht, ob das DOM vollständig ist. Nennt man das "wohlgeformt"?
Ein Beispiel auf dem Tablet einzutippen, ist mir jetzt zu mühevoll, aber bei meinen Spielchen mit deM DOM-Parser habe ich das alles schon ausprobiert.
Liebe Grüße
Tom S.
Oh.
Du meinst sowas hier:
<div><div>Hallo</div> meine <div>Freunde</div></div>
Das würde zu
<div>Hallo</div> meine <div>Freunde</div>
und damit vermutlich falsch.
Driss…
Rolf
Hello,
Du meinst sowas hier:
<div><div>Hallo</div> meine <div>Freunde</div></div>
Das würde zu
<div>Hallo</div> meine <div>Freunde</div>
und damit vermutlich falsch.
Danke. Sowas meinte ich. Meistens ist es ja noch komplexer...
Aber mit dem DOM-Parser geht das wiklich relativ leicht.
Einstieg mit der Methode getelementsbytagname()
Nur für ein einzelnes Dokument lohnt es sich nicht. Da würde ich mir eher einen Formatierer suchen und es dann manuell durchgehen.
Liebe Grüße
Tom S.
Hi,
Idee: Den String von vorne und von hinten durchsuchen nach Paaren von <div><div>...</div></div>
<div>blabla<div>blabla</div></div>
wird dann zu <div>blabla<div>blabla
.
Uuuups.
Deine Tests haben entweder nichts sowohl zwischen den öffnenden und als auch den schließenden Tags, oder Text sowohl zwischen den öffnenden als auch den schließenden Tags.
Problematisch sind die Fälle, bei denen nur entweder zwischen den öffnenden oder den schließenden Tags Text steht.
M.E. muß man das Konstrukt zu einem DOM parsen, und kann dann darin überprüfen, ob ein div-Knoten nichts als whitespace und einen weiteren div-Knoten enthält.
cu,
Andreas a/k/a MudGuard