RegExp für Datumsangaben

Thommy

Thommy

Aktives Mitglied
Thread Starter
Dabei seit
23.06.2003
Beiträge
1.887
Reaktionspunkte
0
Hallo,

ich bin eigentlich ein erfahrender PHP Progger, aber an RegExp hab ich mich noch nie wirklich getraut. Jetzt ist es aber so weit :)

Ich möchte ein Feld auf eine gültige Datumsangabe im Format TT.MM.JJ prüfen.

Folgendes hab ich bereits hinbekommen:
Code:
/^[0-3][0-9]\.[0-1][0-9]\.[0-1][0-9]$/

Funktioniert soweit ganz toll, nur werden natürlich auch folgende Datumsangaben akzeptiert:

39.19.05

Wie baue ich mein Pattern um das es nur bis maximal 31 bzw. 12 geht ?

Natürlich könnt ich mir so ein Pattern irgendwoher nehmen, aber dabei lern ich ja nichts :)

Vielen Dank für eventuelle Denkanstöße :)
Thommy
 
Soweit ich weis ist das per RegExp garnicht so einfach. Die Charachter-Klassen lassen sich nur mit Zahlen von 0-9 definieren.

Hier gibts ein paar Beispiele wie es gehen kann, jedoch meiner Meinung nach viel zu umständlich.

Ein Datum kann man auch sehr leicht über die date-Funktion auf Gültigkeit überprüfen.
Code:
$timestamp=mktime([nutzereingaben...])
if(date('j',$timestamp)!=$tag_nutzereingabe) {
   //kein gültiges datum
}
 
spontane Idee meinerseits:
Du könntest mit explode am . trennen und dann die Einzelbestandteile (sollten genau drei sein) mit >0 und <13 (als Beispiel für den Monat) prüfen.
Da brauchts noch nicht mal ne regex dazu ;).
 
hm ok. grade die zig IF abfragen wollte ich mir halt ersparen, und dacht es geht mit RegExp einfacher. Na dann lass ich es bei dem und prüf danach noch ob es <32 bzw <13 ist :)

@dms: die Exp auf der Seite sind ja der Wahnsinn *nach rechts scroll*
Ich glaub von der Performance sind 2-3 If Abfragen deutlich schneller als so ein riesen Ausdruck oder?
 
Zuletzt bearbeitet:
Thommy schrieb:
...Ich glaub von der Performance sind 2-3 If Abfragen deutlich schneller als so ein riesen Ausdruck oder?

Nein. Ein komplexer Ausdruck ist immer schneller bearbeitet, als mehrere Abfragen. Genauso bei MySQL. Das, was man von MySQL bekommen kann sollte man auch MySQL erledigen lassen (z.B. Datumsformatierungen von datetime oder timestamp in ein natürliches Datum). Genauso sollte man auch den PHP-Interpreter die Aufgaben erledigen lassen Daten zu prüfen anstatt alle Möglichkeiten selbst zu prüfen.
 
Thommy schrieb:
Hallo,

ich bin eigentlich ein erfahrender PHP Progger, aber an RegExp hab ich mich noch nie wirklich getraut. Jetzt ist es aber so weit :)

Ich möchte ein Feld auf eine gültige Datumsangabe im Format TT.MM.JJ prüfen.

Folgendes hab ich bereits hinbekommen:
Code:
/^[0-3][0-9]\.[0-1][0-9]\.[0-1][0-9]$/

Funktioniert soweit ganz toll, nur werden natürlich auch folgende Datumsangaben akzeptiert:

39.19.05

Wie baue ich mein Pattern um das es nur bis maximal 31 bzw. 12 geht ?

Natürlich könnt ich mir so ein Pattern irgendwoher nehmen, aber dabei lern ich ja nichts :)

Vielen Dank für eventuelle Denkanstöße :)
Thommy

Hallo,
als Programmierer solltest du Dir das Buch von O´Reilly "Reguläre Ausdrücke" zulegen. Ist wirklich ein erstklassisches Buch. Für mich ein Standartwerk.

Gruß
Tuxer
 
Kleiner Nachtrag. Nein ich arbeite nicht für den Verlag :D
RegExp´s kann man auch sehr gut in der Kommandozeile einsetzen.
Dafür hab ich sie gelernt.
 
Zuletzt bearbeitet:
Bisher ist mir diese Funktion verborgen geblieben, gerade erst entdeckt. Da sie hier keiner erwähnt hat vermute ich mal dass ich da nicht der einzige bin/war: checkdate()
 
maceis schrieb:
Und wie sieht Dein Lösungsvorschlag aus?

So:

$regex =
'/^((0?\d|[1-2]\d)[. -]\s*'.
'(0?[1-9]|10|11|12)|(30)[. -]\s*'.
'(0?[13456789]|10|11|12)|(31)[. -]\s*'.
'(0?[13578]|10|12))[. -]\s*'.
'(19\d\d|20\d\d)$/x';

Gruß, Micha
 
dms schrieb:
Bisher ist mir diese Funktion verborgen geblieben, gerade erst entdeckt. Da sie hier keiner erwähnt hat vermute ich mal dass ich da nicht der einzige bin/war: checkdate()
Kannte ich auch noch nicht. danke :)
 
Zurück
Oben Unten