RegExp für Datumsangaben

  1. Thommy

    Thommy Thread Starter MacUser Mitglied

    Mitglied seit:
    23.06.2003
    Beiträge:
    1.831
    Zustimmungen:
    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
     
    Thommy, 26.06.2005
    #1
  2. dms

    dms

    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
    }
     
    dms, 26.06.2005
    #2
  3. maceis

    maceis MacUser Mitglied

    Mitglied seit:
    24.09.2003
    Beiträge:
    16.696
    Zustimmungen:
    602
    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 ;).
     
    maceis, 26.06.2005
    #3
  4. Thommy

    Thommy Thread Starter MacUser Mitglied

    Mitglied seit:
    23.06.2003
    Beiträge:
    1.831
    Zustimmungen:
    0
    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?
     
    Thommy, 26.06.2005
    #4
  5. master_p

    master_p MacUser Mitglied

    Mitglied seit:
    31.01.2005
    Beiträge:
    1.063
    Zustimmungen:
    23
    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.

    Datum prüfen wird hier recht gut erklärt:
    http://aktuell.de.selfhtml.org/tippstricks/php/formularvalidierung/#explain1
     
    master_p, 26.06.2005
    #5
  6. Tuxer

    Tuxer MacUser Mitglied

    Mitglied seit:
    23.01.2005
    Beiträge:
    154
    Zustimmungen:
    1
    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
     
    Tuxer, 26.06.2005
    #6
  7. Tuxer

    Tuxer MacUser Mitglied

    Mitglied seit:
    23.01.2005
    Beiträge:
    154
    Zustimmungen:
    1
    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.
     
    Tuxer, 26.06.2005
    #7
  8. maceis

    maceis MacUser Mitglied

    Mitglied seit:
    24.09.2003
    Beiträge:
    16.696
    Zustimmungen:
    602
    Und wie sieht Dein Lösungsvorschlag aus?
     
    maceis, 27.06.2005
    #8
  9. dms

    dms

    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()
     
    dms, 04.09.2005
    #9
  10. michanismus

    michanismus MacUser Mitglied

    Mitglied seit:
    23.08.2004
    Beiträge:
    434
    Zustimmungen:
    0
    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
     
    michanismus, 05.09.2005
    #10
Die Seite wird geladen...
Ähnliche Themen - RegExp Datumsangaben
  1. moses_78
    Antworten:
    10
    Aufrufe:
    705