Hallo dN!3L,
Zitat |
Hast du mal ein Beispiel? |
nimm an, du suchst alle Tags, die mit
/> abgeschlossen sind. Wenn man dafür das Fragezeichen benutzt, also
<.*?/> dann passt das fälschlich auch auf
<b>Wichtig</b><br />, matcht also über mehrere Tags hinweg und nicht nur auf
<br />, wie das beabsichtigt und bei
<[^>]*/> auch der Fall wäre.
Das Fragezeichen sorgt also inbesondere
nicht dafür, dass ein Match später beginnt, damit er (noch) kürzer wird. Auch bei Fragezeichen beginnt der Match immer - wie bei Regex üblich - so weit links wie möglich.
Oder anders gesagt, das Fragezeichen macht den Match nicht automatisch so kurz, wie man das erwartet oder sich das wünscht. Man kann da leicht reinfallen.
Mal abgesehen davon, dass
<[^<]*> ja nicht Absicht, sondern ein Tippfehler war, ist
<td <id="fett"> kein syntaktisch korrektes Html. Insofern finde ich es korrekt, dass das Tag nicht richtig erkannt wird. Außerdem kann man diesen Fall durch
<[^<>]*> leicht in den Griff bekommen, indem man sowohl schließende als auch öffnende spitze Klammern ausschließt.
herbivore
PS: Wenn man nicht nur ein einzelnes Zeichen ausschließen will (im Beispiel die spitze Klammer zu), sondern eine ganze Zeichenfolge, dann muss man zu negativen Lookaheads greifen.
Mit
((?!hallo).)* findet man einen beliebigen Text, aber nur solange bis das Wort hallo auftaucht. Mit
<ul>((?!</?ul>).)*</ul> findet man die zusammengehörigen Tags der (innersten) Bullet-Liste.
Suchhilfe: 1000 Worte, Regex, gierig, Gefahr, gefährlich