RegExp für Datumsangaben

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von Thommy, 26.06.2005.

  1. Thommy

    Thommy Thread Starter MacUser Mitglied

    Beiträge:
    1.833
    Zustimmungen:
    0
    Registriert seit:
    23.06.2003
    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
     
  2. dms

    dms Gast

    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
    }
     
  3. maceis

    maceis MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    Registriert seit:
    24.09.2003
    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 ;).
     
  4. Thommy

    Thommy Thread Starter MacUser Mitglied

    Beiträge:
    1.833
    Zustimmungen:
    0
    Registriert seit:
    23.06.2003
    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: 26.06.2005
  5. master_p

    master_p MacUser Mitglied

    Beiträge:
    1.065
    Zustimmungen:
    23
    Registriert seit:
    31.01.2005
    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
     
  6. Tuxer

    Tuxer MacUser Mitglied

    Beiträge:
    154
    Zustimmungen:
    1
    Registriert seit:
    23.01.2005
    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
     
  7. Tuxer

    Tuxer MacUser Mitglied

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

    maceis MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    Registriert seit:
    24.09.2003
    Und wie sieht Dein Lösungsvorschlag aus?
     
  9. dms

    dms Gast

    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()
     
  10. michanismus

    michanismus MacUser Mitglied

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

Diese Seite empfehlen