Hallo Nico,
([0-9]{0,3}([,.][0-9]{2}|,-|,–)?)
- funktioniert nicht
doch, das funktioniert, aber Du bekommst jede Menge "Leertreffer". Wenn "test 123" der zu durchsuchende String ist, dann beginnt er bei t, stellt fest: Keine Ziffer, womit [0-9]{0,3} abgehakt ist. Dann stellt er fest: weder Punkt noch Komma, und damit ist der optionale Teil ebenfalls abgehakt. Treffer: "". Um nicht in eine Endlosschleife zu verfallen, macht er nun nicht soviele Zeichen später weiter, wie die Trefferlänge beträgt, sondern mindestens ein Zeichen später: beim e. Und es gibt wieder einen Leertreffer.
Ich persönlich finde das doof - ein Leertreffer ist aus meiner Sicht kein Treffer, es gibt aber auch keine Pattern-Option, mit der man ihm sagen kann, dass "" kein Treffer ist. Von daher sollte man Regexe immer so bauen, dass nicht jeder Teil des Patterns optional ist.
Und zwar, weil ich mich frage, warum dieser Unterschied an dieser Stelle diese Auswirkung hat. Ich sage doch eigentlich nur, vor dem Komma können KEINE oder 3 Ziffern stehen.
Selbiges Verhalten gibt es auch bei folgender runtergebrochenen Variante:
Regex:
\d{0,2}
String:test 111
Selektion:Regex:
\d{1,2}
String:test 111
Selektion:11
Regex:
\d{0,2}
String:111
Selektion:11
Regex:
\d{1,2}
String:111
Selektion:11
Welche PHP-Funktion verwendest Du? War das nicht preg_match_all? Du schriebst mal:
ich nutze den Ausdruck mit preg_match_all, um alle Beträge im Suchstring einzusammeln.
Hast Du beim ersten Beispiel oben auch alle Treffer ausgegeben?
Wie kommt es zu diesem unterschiedlichen Verhalten? Ich dachte gerade ich habs, aber irgendwie doch nicht. Ich kann mir den Ablauf nur so erklären:
"t" => Buchstabe => nicht gesucht => nächstes Zeichen
"e" => Buchstabe => nicht gesucht => nächstes Zeichen
"s" => Buchstabe => nicht gesucht => nächstes Zeichen
"t" => Buchstabe => nicht gesucht => nächstes Zeichen
" " => Leerzeichen => nicht gesucht => nächstes Zeichen
Jein. Für jedes dieser Zeichen ist das Pattern sofort vollständig ausgeschöpft, d.h. der "Treffer" ist ein "". Und der landet im Ergebnisarray.
Beobachte dies:
preg_match_all("test 111", "/[0-9]{0,2}/", $resultat);
var_dump($resultat);
Aber ",50" wird mit deinem Regex auch gefunden 🤔
Kann bei [0-9]{1,3} vor dem Komma nicht sein und passiert bei mir auch nicht.
Rolf
sumpsi - posui - obstruxi