PHP Datenimport: HTML-Tags am ANFANG/ENDE entfernen

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.298
Hallo zusammen,

ich nutze eine Anwendung mit einer SQLlite-DB. Leider haut mir die Anwendung immer Standardmäßig (wie sich der Standard definiert habe ich leider noch nicht raus) einen Text-Block immer in <p> - das möchte ich entfernen. Ich möchte diese Datenbank in einer mySQL-DB exportieren um hier eine PHP-Anwendung zu nutzen. Dieses Text-Feld muss ich halt jetzt automatisiert aufräumen...

Ich weiß wie ich p-Tags entfernt bekomme. Das ist grundsätzlich kein Thema. Es geht mir nur um das ERSTE Tag - welches (FAST!) immer ein P ist und den GANZEN String umschließt. Das muss weg.

Beispiel 1:
Code:
<p>hier steht ein Text <br>
noch mehr Text <br>
<b>blablabla</b>
<p>absatz ist auch toll</p>
aber mehr auch nicht
</p>
=> Es sind 2 P-Tags drin - aber auch BR und B - der zweite P (+BR, B) macht Sinn und soll bleiben - das einleitende P (und das geschlossene am Ende) muss weg.

Würde ich generell P entfernt haben wollen könnte ich ja strip_tags(br, b; $string) nutzen - aber das killt mir auch sinnvolle Ps

Hätte dafür jetzt ad-hoc eine fehlerbehaftete Lösung: ltrim, rtrim.
Aber hier hab ich ein großes Problem:

Beispiel 2:
Code:
<p>hier steht ein Text </p>
<p>böaböla </p>
<p>blablzb </p>
<p>test </p>
Match nicht so recht mit meiner Anforderung (würde aber mit ltrim/rtrim matchen...). Hier kille ich jetzt das erste <p> und das letzte - habe danach 2 unvollständige HTML-Tags drinnen :(

Beispiel 3:
Code:
<p>
<p>hier steht ein Text </p>
<p>böaböla </p>
<p>blablzb </p>
<p>test </p>
</p>

hier würde das gehen. Aber wie ermittel ich das? Wie bekomme ich php dazu zu erkennen das es ein String-Umschließendes Tag ist und weg kann?

Beispiel 2 könnte ich per workaround angehen wenn ich wüsste wie ich TAGS entferne die unvollständig sind. Das allein stehende </p> würde ich einfach entfernen (und das alleinstehende <p> am Ende ebenfalls). Aber schön ist die Lösung nicht. In der Ausgabe sollte das aber nicht auffallen das ich ein "unnötiges" Tag gekillt habe. [p hat grundsätzlich keine Style-Angaben ... die kille ich vorher schon; p macht dann trotzdem noch sinn.]

Jemand eine kreative Idee?

Dankö

PS: ja das p stört nicht - vor allem da ich ja IM String weiterhin p nutzen möchte - also nicht böse - warum lasse ich das nicht drin? Mir geht es auch ein wenig darum zu wissen wie ich mit so was umgehen kann. Es könnte ja am Anfang Ende immer ein Smiley stehen was weg muss - im Text muss das aber bleiben usw.
 
Zuletzt bearbeitet:
loadhtmlFile ist jetzt nicht passend - aber loadhtml schau ich mir mal an. -> Bis jetzt fehlt mir aber die Eingebung :confused_alt:

Da im Link ist aber zufällig eine (Zwischen-)Lösung für ein anderes Problem enthalten ;) heredocs kannte ich bisher nicht ;) spart mir viel "kryptisches" gedöns (wobei ich eher mal an eine template-basierte Ausgabe nachdenken sollte ... aber das ist ein ganz anderes Thema!)

Für regex scheint mein Problem aber etwas zu unkonventionell zu sein. Wenn ich NUR Beispiel 1/3 hätte -> ja - aber dafür gibt es auch ltrim/rtrim. Aber ich habe leider auch Beispiel 2 in der Datenbank. Hier müsste regex also abwägen ob es das erste p matchen darf oder nicht. In Beispiel 2 darf es eben nicht matchen :|

Danke schon mal
 
Du lädst mit DOMDocument::loadHTML das HTML in ein DOMDocument, welches von DOMNode erbt, daher kannst du mit $nodeName auf den Namen und mit $childNodes auf die Kinder zugreifen. Aber wahrscheinlich reicht es auf $nodeName ="P" und $nextSibling===null zu testen.

​Ich hoff es ist verständlich, was ich meine.
 
Vielleicht noch eine Erklärung zu dem Lösungsvorschlag von Hancock:
Das DOM-Object bildet in einem hierarchischem Object-Modell die Struktur des geladenen HTML ab. Du kannst also wegen der Hierarchie ohne weitere Umstände feststellen, welches das äußerste HTML-Tag ist - es ist in der Objectstruktur ganz oben. Wenn das p-Tag das gesamte Document umschließt, dann existiert auf der obersten Hierarchieebene nur ein einziges Object und deswegen gibt die Abfrage nach einem weiteren Object auf derselben Hierarchieebene ($nextSibling) null zurück.

Wenn $nextSibling === null, dann hast Du also Fall 1 oder Fall 3, ansonsten liegt Fall 2 vor.
 

Ähnliche Themen

Zurück
Oben