skrap: Datum mit PHP5 ( preg_match )

Hallo zusammen,

möchte mit php5 Datum prüfen, ein Teil ist mir gelungen über folgende Script:

$wert="11.12.1009";  
if (  preg_match("/^[1-31]{2}.[1-12]{2}.[1940-2009]$/", $wert) )  
echo "ja";  
 else  
echo "nein";

Mit Tagen und Monaten komme ich klar aber mit dem Jahr über haupt nicht, hat jemand eine Idee wie ich die Jahres Werte
prüfen kann, der eingegeben Jahres Wert soll von 1940 bis Heute liegen.

Grüße
skrap

  1. Hi,

    $wert="11.12.1009";

    if (  preg_match("/[1]{2}.[1-12]{2}.[1940-2009]$/", $wert) )
    echo "ja";
    else
    echo "nein";

    
    >   
    > Mit Tagen und Monaten komme ich klar  
      
    tatsächlich? Du prüfst, ob der Tag aus zwei Ziffern besteht, die 1, 2 oder 3 sind, und ob der Monat aus zwei Ziffern besteht, die 1 oder 2 sind.  
      
    
    > aber mit dem Jahr über haupt nicht,  
      
    Das Jahr soll bei Dir aus einer einzigen Ziffern bestehen, die 0, 1, 2, 4 oder 9 lautet.  
      
    
    > hat jemand eine Idee wie ich die Jahres Werte  
    > prüfen kann, der eingegeben Jahres Wert soll von 1940 bis Heute liegen.  
      
    Werde Dir erst einmal klar darüber, was eine Zeichenklasse ist und überlege Dir anschließend, ob ein Wertebereich die RegExp-Definition von "Muster" trifft. Anschließend solltest Du erkannt haben, ob eine RegExp für Dein Problem die Lösung darstellt oder maximal ein Hilfsmittel.  
      
    Cheatah  
    
    -- 
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|  
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html  
    X-Will-Answer-Email: No  
    X-Please-Search-Archive-First: Absolutely Yes
    

    1. 1-31 ↩︎

    1. Hallo Leute,

      danke für zahlreichen Meinungen.
      War sehr lehrreich Eure Beiträge zu lesen.

      Nach dem durchlesen der Beiträge habe ich mich entschieden doch für eine verkürzte Version der Regulären Ausdrücke:

        
      if (  preg_match("/^\d{2}\.\d{2}\.\d{4}$/", $wert) )  
      
      

      ich prüfe nur ob die übergeben Zeichenkette bestimmte Voraussetzung erfühlt, den Rest zerlege ich mit explode und prüfe die Werte
      einzel.

      Grüße
      skrap

      1. ich prüfe nur ob die übergeben Zeichenkette bestimmte Voraussetzung erfühlt, den Rest zerlege ich mit explode und prüfe die Werte einzel.

        Warum? Entweder alles mit einem Regulären Ausdruck oder alles mit PHP-Bordmitteln.

        Ein Mix ist imho nur unnötig verwirrend.

  2. Hola

    $wert="11.12.1009";

    if (  preg_match("/[1]{2}.[1-12]{2}.[1940-2009]$/", $wert) )
    echo "ja";
    else
    echo "nein";

      
    Nimm das ganze doch mal systematisch auseinander:  
      
    Tage sind Zahlen zwischen 01 und 31: [01-31]  
    Monate sind Zahlen zwischen 01 und 12: [01-12]  
    Jahre sind vierstellige Zahlen: [0-9]{4}  
      
    Punkte haben in den regulären Ausdrücken allerdins eine andere Bedeutung (stehen für EIN beliebiges Zeichen), die solltest du demnach maskieren: \.  
      
    Hoffe ich konnte dir ein wenig auf die Sprünge helfen.  
      
    Lg  
    Cilla
    

    1. 1-31 ↩︎

    1. @@Cilla:

      nuqneH

      Tage sind Zahlen zwischen 01 und 31:

      Nicht für alle Monate.

      [01-31]

      Das ist aber eins der Zeichen '0', '1', '2', '3'.

      Monate sind Zahlen zwischen 01 und 12: [01-12]

      Selber Fehler.

      Hoffe ich konnte dir ein wenig auf die Sprünge helfen.

      Leider nein.

      Qapla'

      --
      Bildung lässt sich nicht downloaden. (Günther Jauch)
    2. Hi,

      Tage sind Zahlen zwischen 01 und 31: [01-31]

      "[01-31]" ist identisch mit "[3210]". Hilft das weiter?

      Monate sind Zahlen zwischen 01 und 12: [01-12]

      "[210]". Übrigens ist es nicht nötig, die "1" mehrmals zu nennen; weder bei den Tagen noch bei den Monaten.

      Jahre sind vierstellige Zahlen: [0-9]{4}

      Ja, auch 0001 und 9999 sind somit möglich - und 0000, was es gar nicht gab.

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. Jajaja, schon gut, ich hab nen Fehler gemacht. Genug drauf rumgehackt, dem OP nutzt das wenig.

        Dann machen wir das so:

        [01][0-9] für Tage
        [01][0-9] für Monate
        [12][0-9][0-9][0-9] für Jahre

        Ja ich weiß, so sind auch Tage und Monate wie "00" und Jahre wie "1001" und "1000" gültig, aber besser als gar kein Ansatz!

        1. Jajaja, schon gut, ich hab nen Fehler gemacht. Genug drauf rumgehackt, dem OP nutzt das wenig.

          Dann machen wir das so:

          [01][0-9] für Tage

          Das erlaubt alles von 00 bis 19 - manche monate sollen aber sogar über 20 Tage haben :)

          [01][0-9] für Monate

          Das erlaubt alles von 00 bis 19 - ein Jahr hat aber idR. nur 12 Monate

          [12][0-9][0-9][0-9] für Jahre

          ds erlaubt alles von 1000 bis 2999 - gewünscht war aber 1940 bis 2009

          Ja ich weiß, so sind auch Tage und Monate wie "00" und Jahre wie "1001" und "1000" gültig, aber besser als gar kein Ansatz!

          Ein Ansatz der die Möglichkeiten von Regulären Ausdrücken besser ausschöpft, wäre praktisch.

          Für das Jahr z.B.: (19[4-9][0-9]|200[0-9])

        2. @@Cilla:

          nuqneH

          Dann machen wir das so:

          [01][0-9] für Tage
          [01][0-9] für Monate
          [12][0-9][0-9][0-9] für Jahre

          Nee nee, wenn schon mit regulärem Ausdruck, dann aber richtig: http://forum.de.selfhtml.org/archiv/2006/3/t126272/#m814810 ff.

          Qapla'

          --
          Bildung lässt sich nicht downloaden. (Günther Jauch)
        3. Hi,

          Ja ich weiß, so sind auch Tage und Monate wie "00" und Jahre wie "1001" und "1000" gültig, aber besser als gar kein Ansatz!

          woher kommt eigentlich dieses zwanghafte Bestreben, Probleme durch Regular Expressions zu lösen zu versuchen[1], für deren Lösung RegExp gar nicht gedacht sind?

          Ein grundlegend falscher Ansatz ist schlechter als gar kein Ansatz. Es sei denn, man nutzt ihn, um seine Falschheit zu erkennen und sich anders zu orientieren.

          Cheatah

          [1] Und sich damit lediglich weitere Probleme einzuhandeln.

          --
          X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
      2. Hallo,

        »» Jahre sind vierstellige Zahlen: [0-9]{4}
        Ja, auch 0001 und 9999 sind somit möglich - und 0000, was es gar nicht gab.

        kommt drauf an: Die Historiker wollen das Jahr 0 nicht wahrhaben, die Astronomen zählen es aber ganz normal mit (siehe http://www.astro.com/astrology/in_calendar_g.htm, Abschnitt "Jahre vor Christi Geburt").

        Ciao,
         Martin

        --
        Gültig sind Frauen ab 16, wohlgeformt ab 160 Pfund.
          (Gunnar Bittersmann)
    3. Tage sind Zahlen zwischen 01 und 31: [01-31]
      Monate sind Zahlen zwischen 01 und 12: [01-12]

      In Zeichenklassen sollte werden nur ASCII-Zeichen ausgewertet - wenn ich das jetzt richtig interpretiere, steht 01-31 für 0, 1 bis 3 (also 1, 2 und 3) und 1 - also 0, 1, 2 und 3 - sowie zweiteres für 0, 1 und 2.

      1. Hi,

        In Zeichenklassen sollte werden nur ASCII-Zeichen ausgewertet

        Nein, warum sollten z.B. keine nicht-ASCII-aber-iso-8859-1-Zeichen ausgewertet werden?

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hello,

          In Zeichenklassen sollte werden nur ASCII-Zeichen ausgewertet

          Nein, warum sollten z.B. keine nicht-ASCII-aber-iso-8859-1-Zeichen ausgewertet werden?

          http://de.wikipedia.org/wiki/Korinthenkacker!

          Dass suit meinte, dass keine Zahlen, sondern nur Zeichen (Digits) ausgewertet werden, ist Dir doch klar gewesen. Warum sagst Du es dann nicht, wenn Du seinen Beitrag schon richtg stellst - wogegen ja nichts zu sagen ist.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
  3. @@skrap:

    nuqneH

    möchte mit php5 Datum prüfen, ein Teil ist mir gelungen über folgende Script:

    Einen regulären Ausdruck zu benutzen, um Datumseingaben zu prüfen, kann man nicht als gelungenen Ansatz bezeichnen.

    Prüfe numerische Werte!

    Qapla'

    --
    Bildung lässt sich nicht downloaden. (Günther Jauch)
    1. Einen regulären Ausdruck zu benutzen, um Datumseingaben zu prüfen, kann man nicht als gelungenen Ansatz bezeichnen.

      Prüfe numerische Werte!

      Ggf. hilft hierzu auch dieser Fred weiter - da wird ansich dasselbe Thema behandelt. PHP stellt entsprechende Funktionen zur Verfügung um solche Dinge zur prüfen.

      Die Argumentation für den ReExp in diesem Thread war letztlich, alle verschiedenen Datumsformate in einem Ausdruck zu prüfen - das ist aber in deinem Fall nicht relevant, da du nur ein bekanntes Format prüfen möchtest.