Regex Sammlung
In diesem Artikel werden verschiedenste Reguläre Ausdrücke (engl. Regular expression), nach Themenschwerpunkten getrennt, aufgelistet. Reguläre Ausdrücke sind ein wichtiges Mittel um z.B. Benutzereingaben zu prüfen oder Daten zu entschärfen bzw. zu korrigieren/ändern.
Testen eines Datums mittels Regex
Nimmt man aus Selectfeldern oder einfachen Eingabeformularfeldern eine Datumsangabe entgegen, z.B. 2008-08-16, ist das prüfen auf Gültigkeit mittels eines Regexes keine triviale Aufgabe. So können z.B. verschiedene Trennzeichen vorkommen, es gibt Schaltjahre odr ganz einfach Tippfehler. Einen Datum 2008-16-08 kann es ja, sofern die Reihenfolge Jahr-Monat-Tag ist, nicht geben.
Dieser Regex testet Datumswerte von 1583 bis 9999. Vorher galt ein anderer Kalender, wollte man diesen hier noch mit einbauen würde das den Rahmen sprengen.
$eingabe = '2004-02-29'; // nur Zahlen erlauben if (preg_match('/^(?:(?:[2468][048]|16|[3579][26])(?:[02468][048]|[13579][26])|(?:[2468][1-35-79]|1[789]|[3579][013-57-9])(?:0[48]|[2468][048]|[13579][26])|15(?:88|9[26]))([-.\/]?)02\1 29|(?:[2-9]\d\d\d|1[6-9]\d\d|159\d|158[3-9])([-.\/]?)(?:(?:0[13578]|1[02])\2(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)\2(?:0[1-9]|[12]\d|30)|02\2(?:0[1-9]|1\d|2[0-8]))$/x', $eingabe)) { echo "OK, $eingabe passt"; } else { echo "Ooops Fehler, $eingabe passt nicht, Datumsformat, bzw. Datumsbereich falsch."; }
Der Regex mit Komentaren:
(?: # 29. feb. im schaltjahr (?:[2468][048]|16|[3579][26]) # jahrhundert durch 4 teilbar (?:[02468][048]|[13579][26]) # jahr durch 4 teilbar | (?:[2468][1-35-79]|1[789]|[3579][013-57-9]) # jahrhundert nicht durch 4 teilbar (?:0[48]|[2468][048]|[13579][26]) # jahr durch 4 teilbar ausser volle jahrhunderte | 15(?:88|9[26]) # beachtung der einfuehrung des gregor. kalenders ) ([-.\/]?) # separator \1 02\1 29 # 29. feb.; wiederholung des separators \1 | (?:[2-9]\d\d\d|1[6-9]\d\d|159\d|158[3-9]) # beliebiges jahr, ab 1583 ([-.\/]?) # separator \2 (?: (?:0[13578]|1[02]) # langer monat \2 # wiederholung \2 (?:0[1-9]|[12]\d|3[01]) # 01 bis 31 | (?:0[469]|11) # kurzer monat \2 # wiederholung \2 (?:0[1-9]|[12]\d|30) # 01 bis 30 | 02 # februar \2 # wiederholung \2 (?:0[1-9]|1\d|2[0-8]) # 01 bis 28 )
Hinweis: Für PHP gibt es die Funktion checkdate, diese kann Datumsbereiche vom Jahr 1 – 32767 testen.
checkdate (08, 16, 2008);
Das macht obigen Regex eigentlich überflüssig, allerdings zeigt dieser eindrucksvoll was mit Regexen alles möglich ist.
Weitere Informationen
- Metazeichen, Quantifikatoren und Zeichenklassensymbole
- Reguläre Ausdrücke Ziffern
- Reguläre Ausdrücke Buchstaben und Ziffern
- Testen eines Datums mittels Regex Neu
- Regex zum auffinden von URLs in Daten Neu
Keine Kommentare vorhanden