PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FONT-Tag finden indem keine anderen Font-Tags drin sind


IceShack
30.08.2007, 10:46
Hallo ihrs,

ich suche ein pattern um FONT-Tags zu finden in dem kein weiterer FONT-Tag vorkommt.
Das Pattern funktioniert leider nicht:

/<FONT[^>]*>(.*?)(?!<FONT)<\\/FONT>/ibei folgendem Text:

<P><FONT><FONT Roman? New><SPAN EN-GB?><FONT color=#000000>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent sed ipsum. Nam nec metus eget ante interdum nonummy. Morbi eleifend lacus non lacus. Aenean erat. Lorem ipsum dolor sit amet, </FONT><SPAN red?>consectetuer adipiscing elit. Quisque mollis metus. Mauris vehicula arcu vitae massa congue laoreet. Duis nonummy. Proin malesuada scelerisque leo. Donec iaculis sem a sem. Proin tristique imperdiet diam. Vivamus</SPAN><FONT color=#000000> ante. Vivamus pellentesque enim non eros. Nunc imperdiet, dolor in sodales lobortis, magna dui aliquet massa, et semper felis urna eget sem. </FONT></SPAN><FONT color=#000000>Fusce egestas lorem sit amet arcu. </FONT></FONT></FONT></P>Er findet in dem Text unter anderem folgenden Schnipsel der Falsch ist:

<FONT><FONT Roman? New><SPAN EN-GB?><FONT color=#000000>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent sed ipsum. Nam nec metus eget ante interdum nonummy. Morbi eleifend lacus non lacus. Aenean erat. Lorem ipsum dolor sit amet, </FONT>Er sollte eigentlich nur folgendes finden:

<FONT color=#000000>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent sed ipsum. Nam nec metus eget ante interdum nonummy. Morbi eleifend lacus non lacus. Aenean erat. Lorem ipsum dolor sit amet, </FONT>Wäre echt super wenn da jemand ne Idee hätte

MfG

IceShack


smg
30.08.2007, 12:42
Leider hast du nicht verraten welche Sprache du verwenden möchtest, daher gehe ich von Perl aus die PCRE verwendet.

Der Regex: (?><font[^>]*>)+(<font[^>]*>.+?</font>)
Modifier: i
Eingabetext:
<FONT><FONT><FONT color=#000000>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent sed ipsum. Nam nec metus eget ante interdum nonummy. Morbi eleifend lacus non lacus. Aenean erat. Lorem ipsum dolor sit amet, </FONT></FONT></FONT>

Perlcode:
perl -le '$_=<>; print "$1" if m,(?><font[^>]*>)+(<font[^>]*>.+?</font>),i'

Alles zusammen:

echo '<FONT><FONT><FONT color=#000000>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent sed ipsum. Nam nec metus eget ante interdum nonummy. Morbi eleifend lacus non lacus. Aenean erat. Lorem ipsum dolor sit amet, </FONT></FONT></FONT>' | perl -le '$_=<>; print "$1" if m,(?><font[^>]*>)+(<font[^>]*>.+?</font>),i'


Erklärung:
Ich lese in die Variable $_ den Text ein.
Er matcht dann den Text der in $_ steht mit dem Regex (?><font[^>]*>)+(<font[^>]+>.+?</font>) wobei ich , , (Kommas) als Delimiter verwende um nicht / (Backslash) escapen zu müssen. Als Resultat liefert er dir das was du wolltest in der Capturegroup 1.

<FONT color=#000000>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent sed ipsum. Nam nec metus eget ante interdum nonummy. Morbi eleifend lacus non lacus. Aenean erat. Lorem ipsum dolor sit amet, </FONT>

Zum Regex:
Falls du dazu Erläuterungen brauchst reiche ich die dann gerne nach, und/oder wenn du Verbesserungsvorschläge zur Performance hast.