regex Ausdrücke mit festdefiniertem Ende?
Hallo,
ich versuche einen regexausdruck zu finden der einen Teil aus einer PHP-Zeichenkette findet. mein Regexausdruck heißt: <i>xmlelementname:</i>(.*)<br>
mein Problem ist nun das er diesen Teilstring nicht findet. erfindet aus dem gesamten String:
XML-Element1 - text vom 22.03.2021 08:06 Uhr:</b><br><i>xmlelementname:</i> - Text Text Text<br><i>XML-Element2:</i> <br>- Text<br><i>XML-Element3:</i></b><br>Text Text Text. Text Text Text.<br>
ich will mit meinen Regexausdruck den Fett hervorgehobenen bereich erhalte aber den Kursiven Text.
<i>xmlelementname:</i> - Text Text Text<br><i>XML-Element2:</i> <br>- Text<br><i>XML-Element3:</i></b><br>Text Text Text. Text Text Text.<br>
weiß einer warum er den das erste <br> nicht erkennt
3 Antworten
Das ist greedy, dh. es matcht so viel wie möglich. Da gibts aber auch modifier / Anweisungen um das zu ändern und so wenig wie möglich zu matchen, das wäre dann "lazy".
Einfach ein ? an den quantifier anhängen (also *?, +? usw.)
Teils gibts glaube ich auch einen Ungreedy modifier für die gesamte Expression.
Mehr findest du auf https://regex101.com . Beachte allerdings das verschiedene Regex Engines verschiedene Features haben auch z.B. im Web Firefox teils andere als Chromium.
Regular Expressions sind standardmäßig "greedy". Das heißt, sie finden immer den längsten möglichen Match. Du muss also eine "non-greedy" Expression machen.
Versuche
<i>xmlelementname:</i>(.*?)<br>
Beachte das Fragezeichen hinter dem Stern.
Regex Ausdrücke umfassen immer den maximal möglichen Bereich. Der gefundene Ausdruck endet nicht beim ersten Treffer, sondern beim letzten. Du musst ggfls vorher terminieren. Du wirst evtl Element2 in dein pattern aufnehmen müssen. Im vorliegenden Beispiel würde die 2 genügen.