RegExp - Problem mit lookahead assertion
Andreas Dölling
- php
Hallo,
ich habe einen HTML-Text, den ich in zwei Hälften trenne.
Das klappt mittlerweile (auch dank Forumshilfe) gut, sprich: am Ende von Teil 1 ist kein Wort oder Tag abgeschnitten.
Jetzt kann es allerdings noch sein, daß ein Tag am Ende der ersten Texthälfte nicht geschlossen ist.
Beispiel:
[<p>]Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p><p class="divider"></p><p>Integer pulvinar dolor a augue. Sed ac urna. Suspendisse <span class="foo">potenti.[</p>]
Hier ist das SPAN-Element am Ende nicht geschlossen, da der Rest in der zweiten Texthälfte sitzt.
(Anmerkung: die äußeren P-Tags setze ich erst ganz am Ende um die Texthälfte.)
Ich versuche nun dieses nicht geschlossene SPAN-Element so zu erwischen:
/<([^>\s/]+)(\s+[^>]*)>.*(?!</\1>)$/smU
Leider aber matcht dieser Ausdruck dies:
0 = <p class="divider"></p><p>
1 = p
2 = class="divider"
Das verstehe ich nicht.
Mein Ausdruck sagt doch: suche ein <foo ...>...., dem bis zum Ende des Textes kein </foo> folgt.
Oder?
Der Ausdruck sollte doch eigentlich das SPAN-Element matchen.
Aber ich fürchte, daß ich hier einen gewaltigen Denkfehler in meinem Ansatz habe - und hoffe natürlich mal wieder auf einen hilfreichen Schlag auf den Hinterkopf von Euch.
;)
Thanx und ciao,
Andreas
echo $begrüßung;
Aber ich fürchte, daß ich hier einen gewaltigen Denkfehler in meinem Ansatz habe
Das denke ich auch. Ich gehe mal, wenn du erlaubst, nicht weiter auf das konkrete Problem ein.
Mein Ausdruck sagt doch: suche ein <foo ...>...., dem bis zum Ende des Textes kein </foo> folgt.
Vom Gedanken her, soweit so einfach. Viel zu einfach. Was ist, wenn zwischendrin ein weiteres <foo> geöffnet wird oder unerlaubte Verschachtelungen auftauchen (<b><i></b></i>)? Sowas kann man sicherlich auch noch mit einem regulären Ausdruck abfangen, aber der wird bestimmt ziemlich unhandlich. Mit einem Mustererkenner kann man eine Menge machen, aber irgendwann ist ein Parser besser geeignet.
Ich denke, du kommst besser, wenn du Christian Seilers BBCode-Parserklasse verwendest oder zumindest nach seinem Prinzip vorgehst. (Du hast zwar "richtigen" HTML-Code und keinen BBCode, aber das sollte sich problemlos umschreiben lassen.)
echo "$verabschiedung $name";
Hallo,
Vom Gedanken her, soweit so einfach. Viel zu einfach. Was ist, wenn zwischendrin ein weiteres <foo> geöffnet wird oder unerlaubte Verschachtelungen auftauchen (<b><i></b></i>)?
nein, das kommt nicht vor. Hätte ich erwähnen sollen.
Ciao,
Andreas
gudn tach!
ich habe einen HTML-Text, den ich in zwei Hälften trenne.
zu welchem zweck? (das kann beim loesen des problems hilfreich sein.)
Jetzt kann es allerdings noch sein, daß ein Tag am Ende der ersten Texthälfte nicht geschlossen ist.
kann im string sowas wie <br /> oder <br> (ohne end-tag) vorkommen?
"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p><p class="divider"></p><p>Integer pulvinar dolor a augue. Sed ac urna. Suspendisse <span class="foo">potenti."
Ich versuche nun dieses nicht geschlossene SPAN-Element so zu erwischen:
/<([^>\s/]+)(\s+[^>]*)>.*(?!</\1>)$/smULeider aber matcht dieser Ausdruck dies:
0 = <p class="divider"></p><p>
1 = p
2 = class="divider"Das verstehe ich nicht.
dann gehen wir's einzeln durch:
< sucht '<' und findet als erstes das erste vorkommende '<'
</p><p class="divider">[...]
^ das da
danach soll aber mindestens ein [^>\s/] folgen, also springen wir zum naechsten '<' (da dem ersten ein '/' folgt)
<p class="divider">[...]
^^ passt
$1 ist jetzt 'p'
als naechstes soll mindestens ein \s gematcht werden.
<p class="divider">[...]
^^^ passt
$1 ist 'p'
$2 ist bisher ' '
danach beliebig viele [^>] und danach ein '>'.
<p class="divider">[...]
^^^^^^^^^^^^^^^^^^^ passt
$1 ist 'p'
$2 ist ' class="divider"'
der rest .*(?!</\1>)$
ist also .*(?!</p>)$
und damit dasselbe wie .*$, denn nach dem letzten zeichen (vor dem naechsten zeilenumbruch oder stringende) steht nun mal nicht '</p>'.
dass allerdings
$0 == '<p class="divider"></p><p>'
ist, laesst mich vermuten, dass dahinter z.b. ein \n steht. sonst muesste $0 bis zum letzten zeichen gehen.
Mein Ausdruck sagt doch: suche ein <foo ...>...., dem bis zum Ende des Textes kein </foo> folgt.
Oder?
nee, eher sowas: suche ein <foo ...>...., welchem nach dem Ende des Textes kein </foo> folgt. ;-)
prost
seth