Thomas: Fehlerhafte Regex

Abend,

Über http://regular-expressions.info habe ich mir die Grundlagen zu Regular Expressions für mein PHP-Projekt geholt. Der Code funktionert gut, es wird überprüft, ob ein String ein Datum enthält (dabei ist es zu diesem Punkt noch völlig egal, ob der User statt z.B. 01.03.2005 32.99.0001 eingibt, es geht nur um die Formatierung). Eines der eregi()s überprüft nun die deutsche Datumsformatierung:

eregi("[0-9]{2}.[0-9]{2}.[0-9]{4}",$variable)

Dies funktioniert bestens, jetzt sollen aber auch Daten wie
1.2.05
01.2.2005
12.02.04
angenommen werden. Meine Ideen waren folgende:

eregi("[0-9}{(2|1)}.[0-9]{(2|1)}.[0-9]{(4|2)}",$variable)
eregi("[0-9}{2|1}.[0-9]{2|1}.[0-9]{4|2}",$variable)

Beide sind leider falsch. Der erste Code wird von eregi als korrekt verarbeitet, bezeichnet aber eine (mir unbekannte) andere Regel. Wie muss der Code verändert werden, um bei obigen Beispieldaten ein match zu erzielen?

Gruß
Thomas

  1. Moin!
    checkdate() könnte dir bei deiner endgültigen lösung behilflich sein.
    zu deinem regex:
    schau mal hier: Welche Bauelemente kommen in Regulären Ausdrücken vor?.  Schau dort mal unter   Quantifizierern. Da steht das was du suchst.
    tschüssi
    ichen

    --
    ie:{ fl:( br:> va:) ls:[ fo:| rl:( n4:# ss:) de:] js:| ch:{ mo:} zu:)
    1. Abend,

      danke für deine Hilfe. Zwei Konflikte kann ich jedoch noch nicht lösen:

      eregi("[0-9]{1,2}.[0-9]{1,2}.[0-9]{2,4}",$variable)

      erlaubt nun ein- und zweistellige Monats- und Tagesangaben, jedoch kann man momentan auch noch dreistellige Jahreszahlen eintragen. Im verlinkten Faq ist, soweit ich es sehen kann, nur von Minima, Maxima und Bereichen die Rede, nicht jedoch von Ausnahmen in Quantifizierungen.

      Das zweite Problem (welches mir eben erst beim Testen auffiel) ist, dass
      f0.00.0000
      oder
      00.00.00ab
      auch als korrekt erkannt werden. eregi() untersucht scheinbar nur die Existenz IN einem String, nicht die Existenz ALS einziger Inhalt eines Strings. Wie verbiete ich vor und nach meinem Ausdruck weitere Zeichen?

      mfG
      Thomas

      1. Moin!

        eregi("[0-9]{1,2}.[0-9]{1,2}.[0-9]{2,4}",$variable)

        Hier wirst du es wohl so schreiben müssen:
        [0-9]{1,2}.[0-9]{1,2}.([0-9]{2}|[0-9]{4})

        Das zweite Problem (welches mir eben erst beim Testen auffiel) ist, dass
        f0.00.0000
        oder
        00.00.00ab
        auch als korrekt erkannt werden. eregi() untersucht scheinbar nur die Existenz IN einem String, nicht die Existenz ALS einziger Inhalt eines Strings. Wie verbiete ich vor und nach meinem Ausdruck weitere Zeichen?

        Nutze hier lieber preg_mathch(). preg_match prüft die exitens ALS einen string, das fand ich heraus, als ich nur kurz folgendes kleines beispiel probierte:

          
        <?php  
        $s = "f0.00.0000";  
        $reg = "/^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{2,4}$/";  
        echo preg_match($reg,$s); //ausgabe: 0 (für FALSE)  
        echo eregi("[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{2,4}",$s); //ausgabe: 1 (für TRUE)  
        ?>  
        
        

        Außerdem sind die preg_*-funktionen schneller.

        tschüssi
        ichen

        --
        ie:{ fl:( br:> va:) ls:[ fo:| rl:( n4:# ss:) de:] js:| ch:{ mo:} zu:)
        1. Hi ichen,

          $reg = "/^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{2,4}$/";

          Wenn du den RegEx mit eregi() verwendet hättest, hätte der es auch schon tun sollen - du verwendest hier direkt (richtigerweise) ^ und $, allerdings ohne es zu wissen ;-)

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Ich finde, der IE ist eine super Software. Nur eben nicht als Browser. (Manuel B.)
          1. Moin!

            Wenn du den RegEx mit eregi() verwendet hättest, hätte der es auch schon tun sollen - du verwendest hier direkt (richtigerweise) ^ und $, allerdings ohne es zu wissen ;-)

            bei den regex bin ich noch nicht so fit, aber ich habe nach meinem post gelesen, dass die ^$ den string begrenzen. man lernt nie aus :)

            tschüssi
            ichen

            --
            ie:{ fl:( br:> va:) ls:[ fo:| rl:( n4:# ss:) de:] js:| ch:{ mo:} zu:)
      2. echo $begrüßung;

        eregi("[0-9]{1,2}.[0-9]{1,2}.[0-9]{2,4}",$variable)

        erlaubt nun ein- und zweistellige Monats- und Tagesangaben, jedoch kann man momentan auch noch dreistellige Jahreszahlen eintragen. Im verlinkten Faq ist, soweit ich es sehen kann, nur von Minima, Maxima und Bereichen die Rede, nicht jedoch von Ausnahmen in Quantifizierungen.

        Ein Regex sucht nur Muster, nicht mehr.

        Wenn ich nicht daneben liege sollte man so ([0-9]{2})|([0-9]{4}) zwei- oder vierstellige Zahlen suchen können.

        Kennst du schon die Funktion checkdate()? Die kann dir nach dem Mustervergleich die Prüfung auf ein korrektes Datum übernehmen.

        Wie verbiete ich vor und nach meinem Ausdruck weitere Zeichen?

        mit ^ vorn und $ hinten dran

        echo "$verabschiedung $name";