>Hier habe ich versucht, zu überprüfen, ob am Anfang ein - vorkommt (soll ja erlaubt sein, ist aber kein Muss)
Das ist schon der erste Fehler - in Deiner Expression ist das Minuszeichen Pflicht. Und (leider) die ganze Expression ist ziemlicher Müll. Du hast total umständlich gedacht.
Gehen wir der Reihe nach:
Am Anfang steht ein Minuszeichen, aber nur optional und auch nur eines. Das Pattern, was "Anfang" einer Zeichenkette bedeutet, ist der Zirkonflex '^'. Danach kann ein oder kein Minuszeichen kommen - das Zeichen, welches das davorliegende 0 oder 1 Mal mal qualifiziert, ist das Fragezeichen '?'. Damit haben wir den Anfang:
- Code: Select all
^-?
Du hast dort die Klassendefinition [-] stehen, die völlig sinnlos ist, weil dort normalerweise Mengen von Zeichen stehen. Ich kann Dir an anderer Stelle mal erklären, was die eckigen heißen. Außerdem hast Du auch tonnenweise zuviele Backreferenzen definiert, das sind die runden Klammern auf und zu - die brauchst Du auch nicht.
Aber wir machen weiter. Jetzt ist die Frage, muss die Eingabe exakt zweistellig plus Komma plus zweistellig dahinter sein, oder darf vor dem Komma auch nur eine Stelle stehen? Ich mache beide Fälle. Erst der Fall "genau zweistellig":
- Code: Select all
^-?[0-9][0-9],[0-9][0-9]$
Das Dollarzeichen bedeutet "Ende" des Eingabestrings. Achtung: ggf. mußt Du den Eingabestring mit trim() kürzen, denn sonst werden nachfolgende Leerstellen zu Fehlern in der Erkennung führen.
Die Klasse [0-9] kann man sogar noch abkürzen, denn ein digitales Zeichen kann man auch direkt mit \d suchen:
- Code: Select all
^-?\d\d\.\d\d$
Und nun noch der Fall, dass vor dem Komma eine oder zwei Stellen stehen:
- Code: Select all
^-?\d+,\d\d$
Das Pluszeichen '+' bedeutet, das vorhergehende Zeichen mindestens einmal und optional noch einmal (also insgesamt zweimal). Das gleiche erlauben wir nun hinter dem Komma auch noch, und dann sieht es so aus:
- Code: Select all
^-?\d+,\d+$
Und das war es. Die Start- und Endezeichen sind wichtig, weil sonst auch "eingebettete" Zeichenketten als erlaubt durchkämen, beispielsweise der Satz "das kostet 23,45 Euro" würde als ganzes akzeptiert werden.
Dann solltest du nicht die ereg-Funktionen verwenden, das sind erweiterte reguläre Ausdrücke, die etwas rechenintensiver sind aber gar nicht benötigt werden, die eregi()-Funktion ignoriert auch noch Gross-Kleinschreibung, das brauchst Du ebenfalls nicht. Nimm die einfach preg_match-Funktion, da muss man im Unterschied zu ereg-Funktion das Pattern noch "einschließen" in Start- und Endezeichen, üblicherweise der Slash '/' (man kann aber auch andere Zeichen nehmen, das bietet sich dann an, wenn der Slash im Suchpattern selbst gebraucht wird).
So sieht es zum Schluss aus:
- Code: Select all
if (!preg_match('/^-?\d+,\d+$/', $newDL)) ...
P.S.: Ich sehe gerade noch den Vorschlag von "Wiedmann", die erlaubt auch Eingaben von Werten ohne Komma. Allerdings fehlen da die Start-Ende-Begrenzer. Das kann man natürlich zusammenfügen (und vereinfachen - der optionale Operator ?: ist nicht notwendig, da die Zahl davor sowieso verpflichtend ist):
- Code: Select all
if (!preg_match('/^-?\d+(,\d+)?$/', $newDL)) ...
P.P.S.: Oups! Ich bin doof - der +-Operator frißt zuviel, man muss doch entweder \d\d? oder \d{1,2} nehmen:
- Code: Select all
if (!preg_match('/^-?\d{1,2}(,\d{1,2})?$/', $newDL)) ...