Hallo Rolf,
… Von daher sollte man Regexe immer so bauen, dass nicht jeder Teil des Patterns optional ist.
Das nehme ich einfach mal als Lektion mit 🤓
Welche PHP-Funktion verwendest Du? War das nicht preg_match_all? Du schriebst mal:
Hast Du beim ersten Beispiel oben auch alle Treffer ausgegeben?
Ich hatte nur im Regex Coach getestet, der zeigt die Leertreffer nicht an, hab ich jetzt bemerkt. Zumindest nicht in meiner Ansicht.
Kann bei [0-9]{1,3} vor dem Komma nicht sein und passiert bei mir auch nicht.
Bei mir jetzt auch nicht mehr. Da hab ich mich wohl vertan.
Ich hab den Ausdruck jetzt nochmal etwas erweitert, u.a. weil er bei "1234,50" sowohl "123" als auch "4,50" gefunden hat. Ich hab mich entschieden, dass in dem Fall lieber nichts gefunden werden soll als womöglich falsch getrennte Zahlen. Deshalb hab ich zur Bedingung gemacht, dass vor der ersten Ziffer der Zeilenanfang ODER ein Leerzeichen ODER ( stehen muss (Lookbehind) und hinter einem gefundenen Betrag nicht direkt eine Ziffer folgen darf (neg. Lookahead):
edit: "Betrag:12" soll auch gefunden werden, also auch :
$reg = "/(?<=^|\s|\(|:)\d{1,3}(?:[,.](?:\d{2}|-|–))?(?!\d)/";
$str = "12 test 1234,50 15,50 98,- ,50 Test(3.79) Betrag:12€";
preg_match_all($reg, $str, $arr);
// Ergebnis:
array(1) {
[0]=>
array(5) {
[0]=>
string(2) "12"
[1]=>
string(5) "15,50"
[2]=>
string(4) "98,-"
[3]=>
string(4) "3.79"
[4]=>
string(2) "12"
}
}
Ist ein ganz schönes Ungetüm geworden, aber das Ergebnis sieht gut aus. Wärs auch anders gegangen? Vermutlich. Ich hab gelesen, dass Lookaheads und Lookbehinds für die Performance Gift sein sollen. Aber die Strings, die ich untersuche, haben selten mehr als 30 Zeichen, daher hoffe ich, dass das nicht so sehr ins Gewicht fällt.
Schöne Grüße
Nico