Michi: Reguläre Ausdrücke - Datum

Hallo zusammen

Für euch sicher ein leichtes mein Problem zu lösen. Trotz PHP Buch und Dr. Google will es einfach nicht.

Ich habe ein Formular und möchte per PHP prüfen ob das Datum so eingegeben wurde, wie ich es gern hätte:

if (!eregi('([0-9]{2}).([0-9]{2}).([0-9]{2,4})', $geb)){
  echo ("<font color='red'>Bitte geben Sie das Geburtsdatum nach folgendem Muster ein TT.MM.JJJJ oder TT.MM.JJ!<br> Die Eingabe von <b>$geb</b> ist nicht korrekt.</font><br>");}

Meiner Meinung nach sollten jetzt nur die Eingaben TT.MM.JJJJ und TT.MM.JJJJ erlauben...wenn ich es aber teste geht auch TT.MM.JJJJJ :-(

Was mache ich falsch...vielen Dank für eure Hilfe.
Gruss
Michi

  1. !preg_match('/\d\d.\d\d.\d\d(\d\d)?/si', $deineEingabe)

    Warum das mit TT.MM.JJJJJ funktioniert ist schnell erklärt:

    es wird ja getestet, ob der reguläre Ausdruck ein TEIL deiner Eingabe ist. Du musst noch festlegen, daß danach zB keine weiteren Zeichen kommen !!!
    Und da wäre zB \D sinnvoll weil \D alles ausser einer Zahl ist:

    !eregi('([0-9]{2}).([0-9]{2}).([0-9]{2,4})\D', $geb))

    1. Und da wäre zB \D sinnvoll weil \D alles ausser einer Zahl ist:

      !eregi('([0-9]{2}).([0-9]{2}).([0-9]{2,4})\D', $geb))

      Vielen Dank für deine Hilfe...aber leider hat es so nicht geklappt.
      Wie dem auch sei...ich danke dir nochmals, für deine Mühe!

      Gruss
      Michi

      1. Und da wäre zB \D sinnvoll weil \D alles ausser einer Zahl ist:

        !eregi('([0-9]{2}).([0-9]{2}).([0-9]{2,4})\D', $geb))
        Vielen Dank für deine Hilfe...aber leider hat es so nicht geklappt.
        Wie dem auch sei...ich danke dir nochmals, für deine Mühe!

        Gruss
        Michi

        Was genau klappt nicht ???
        Was ich noch vermute ist, daß ereg vielleicht das \D nicht kennt.
        Du solltest von dem veralteten ereg zu dem besseren und schnelleren preg_match wechseln...

        Gruß,
        Mathias

    2. Hi flashnfantasy,

      es wird ja getestet, ob der reguläre Ausdruck ein TEIL deiner Eingabe ist.

      Richtig.

      Du musst noch festlegen, daß danach zB keine weiteren Zeichen kommen !!!
      Und da wäre zB \D sinnvoll weil \D alles ausser einer Zahl ist.

      Nein, so ist das überhaupt nicht sinnvoll. Den Stringanfang kennzeichnet man mit ^
      und das Stringende mit $.

      Ein richtiger[tm] regex müsste also so in etwa aussehen:

      /^\d\d.\d\d.\d\d\d\d$/

      MfG, Dennis.

      --
      Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
      Werbung ist der Versuch, das Denkvermögen des Menschen so lange außer Kraft zu setzen, bis er genügend Geld ausgegeben hat. (Ambrose Bierce)
      1. Nein, so ist das überhaupt nicht sinnvoll. Den Stringanfang kennzeichnet man mit ^
        und das Stringende mit $.

        Das setzt vorraus, daß du nur das Datum als Eingabe hast und du schon alles davor und dahinter abgeschnitten hast.
        Sobald du aber mit der Option /s arbeitest, kannst du auch Zeilenende als nicht-Zahl nehmen...

        1. Hi flashnfantasy,

          Das setzt vorraus, daß du nur das Datum als Eingabe hast (...)

          Da hast du Recht, allerdings stellt man dem User i.d.R. nicht nur ein Eingabefeld für mehrere Werte zur Verfügung.

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Auf viele Fragen weiß auch Wikipedia eine Antwort.
  2. Hallo!
    Wie schon gesagt wurde, guckst du ja nur, ob der Teil in der Variable vorkommt. Eine Lösung wäre z.B. an den Anfang ein ^ und an das Ende ein $ einzufügen. Außerdem würde ich empfehlen die Punkte zu maskieren, da sie im Moment für jedes beliebige Zeichen stehen.

    Also mein Vorschlag:
    eregi('^([0-9]{2}).([0-9]{2}).([0-9]{2,4})$', $geb)

    Michael

    1. Also mein Vorschlag:
      eregi('^([0-9]{2}).([0-9]{2}).([0-9]{2,4})$', $geb)

      Recht herzlichen Dank...jetzt geht es tatsächlich...und ich habe schon wieder ein weiteres Stück php Kenntnisse in meiner Sammlung.

      Gruss
      Michi

  3. Hi!

    if (!eregi('([0-9]{2}).([0-9]{2}).([0-9]{2,4})', $geb)){
      echo ("<font color='red'>Bitte geben Sie das Geburtsdatum nach folgendem Muster ein TT.MM.JJJJ oder TT.MM.JJ!<br> Die Eingabe von <b>$geb</b> ist nicht korrekt.</font><br>");}

    Meiner Meinung nach sollten jetzt nur die Eingaben TT.MM.JJJJ und TT.MM.JJJJ erlauben...wenn ich es aber teste geht auch TT.MM.JJJJJ :-(

    Du fragst ja auch nur, ob "TT[irgendein Zeichen]MM[irgendein Zeichen]JJJJ" im Such-String enthalten ist. Und das trifft auf "TT.MM.JJJJJ" wohl zu. Es würde übrigens auch "asdjklasdaTTxMMyJJJJasdasd" zutreffen.

    An Deiner Stelle würde ich lieber die Perl-kompatiblen Funktionen (PCRE) nehmen, in diesem Fall wohl preg_match().

    Und dann vielleicht mal in die Sytax einlesen:

    http://de.selfhtml.org/perl/sprache/regexpr.htm
    http://de3.php.net/manual/de/reference.pcre.pattern.syntax.php

    Du solltest Dich informieren, wozu die Sonderzeichen ^ und $ gut sind, und welche besondere Bedeutung der "." hat, und wie man das verhindert (Stichwort "Maskierung").

    Grüße
    Andreas

    --
    SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/