Problem mit preg_match statt ereg nach PHP Umstellung

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit preg_match statt ereg nach PHP Umstellung

    Hallo @ll

    Ich suche mich im Netz dumm und dusslig ohne das ich eine Lösung finde bzw. die richtige Lösung ableiten kann.

    Mein Provider hat auf PHP 5.4 umgestellt und seitdem laufen meine Scripte nicht mehr :-( Viele Fehler habe ich beheben können, aber hier stoße ich an meine Grenzen.

    ereg wird nicht mehr unterstützt und mit preg_match bekomme ich es einfach nicht hin. :-(
    Ich habe 3 Fälle in denen ich auch keine andere Ausweichlösung hinbekomme.

    Fall 1:
    PHP Code:
    $aktuell "2001-2002";
    // "2001-2002" ist nur ein Beispiel. 
    // Die Variable $aktuell kommt aus einer Datenbank und es muss mit 
    // beiden Zahlen seperat gerechnet werden können.

    if (ereg ("([0-9]{4})-([0-9]{4})"$aktuell$regs))
    {
          
    $jahr_1 $regs[1] + 1;
          
    $jahr_2 $regs[2] + 1;

    Fall 2:
    PHP Code:
    $neudatum "2011-03-15";
    // "2011-03-15" ist nur ein Beispiel. 
    // Die Variable $neudatum kommt aus einem Eingabefeld und es soll
    // geprüft werden ob es eben in diesem Format eingegeben wurde.

    if (ereg ("([0-9]{4})-([0-9]{2})-([0-9]{2})"$neudatum))
    {
       echo 
    "Das Datumsformat wurde richtig eingegeben.";

    else 
    {
       echo 
    "Das Datumsformat ist ungültig.";

    Fall 3:
    PHP Code:
    $uhrzeitneu "20:15";
    // "20:15" ist nur ein Beispiel. 
    // Die  Variable $uhrzeitneu kommt aus einem Eingabefeld und es soll
    // geprüft  werden ob es eben in diesem Format eingegeben wurde.


    if (ereg ("([0-9]{2}):([0-9]{2})"$uhrzeitneu)) 
    {
       echo 
    "Das Uhrzeitformat wurde richtig eingegeben.";

    else 
    {
       echo 
    "Das Uhrzeitformat ist ungültig.";

    Ich bin dankbar für jede Hilfe.

  • #2
    Die Alternative für ereg ist preg_match, mit dem Unterschied, dass das Muster mit Delimitern wie z.B. /Muster/ oder #Muster# zu begrenzen ist.

    Fall 2:

    PHP Code:
    $neudatum "2011-03-15";
    // "2011-03-15" ist nur ein Beispiel. 
    // Die Variable $neudatum kommt aus einem Eingabefeld und es soll
    // geprüft werden ob es eben in diesem Format eingegeben wurde.

    if (preg_match("/([0-9]{4})-([0-9]{2})-([0-9]{2})/"$neudatum))
    {
       echo 
    "Das Datumsformat wurde richtig eingegeben.";

    else 
    {
       echo 
    "Das Datumsformat ist ungültig.";

    Comment


    • #3
      danke @Melewo

      Habe alle 3 Probleme hinbekommen

      Comment


      • #4
        Kleiner Tip:

        Statt
        PHP Code:
        if (preg_match("/([0-9]{4})-([0-9]{2})-([0-9]{2})/"$neudatum)) 
        Solltest du
        PHP Code:
        if (preg_match("/([0-9]{4})-([0-9]{2})-([0-9]{2})$/"$neudatum)) 
        verwenden. Das $-Zeichen steht für das Zeilenende. Nutzt du dieses Steuerzeichen nicht, wird beim Datum z.b. auch das hier: 2013-01-023 gematcht!

        Hier mal für alle 3 Fälle von dir die entsprechenden Patterns:

        PHP Code:
        $value '2001-2012';
        $pattern '/^([0-9]{4})-([0-9]{4})$/';
        preg_match($pattern$value$result);
        print_r($result);
        /*
         * Output:
         * Array
         * (
         *     [0] => 2001-2012
         *     [1] => 2001
         *     [2] => 2012
         * )
         */

        $value '2001-03-15';
        $pattern '/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/';
        preg_match($pattern$value$result);
        print_r($result);
        /*
         * Output:
         * Array
         * (
         *     [0] => 2001-03-15
         *     [1] => 2001
         *     [2] => 03
         *     [3] => 15
         * )
         */

        $value '20:15';
        $pattern '/^([0-9]{2}):([0-9]{2})$/';
        preg_match($pattern$value$result);
        print_r($result)';
        /*
         * Output:
         * Array
         * (
         *     [0] => 20:15
         *     [1] => 20
         *     [2] => 15
         * )
         */ 
        Last edited by CPCoder; 02-04-2013, 20:43.

        Comment


        • #5
          @CPCoder

          Vielen lieben Dank. Ich hätte es wahrscheinlich erst gemerkt wenn es zu spät gewesen wäre

          Dank Deines postens der 3 Beispiele ist mir sogar selbst noch was aufgefallen.

          Hatte erst Deine Zeile mit dem $ ausprobiert.
          PHP Code:
          if (preg_match("/([0-9]{4})-([0-9]{2})-([0-9]{2})$/"$neudatum)) 
          Tatsächlich *grins* 2011-10-015 wird nun abgefangen.
          Aber z.B. 2011-010-15 wurde nicht abgefangen.

          Dank Deiner 3 ausgearbeiteten Beispiele habe ich die Lösung *freu*
          Das ^ hatte vorn gefehlt.
          PHP Code:
          if (preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/"$neudatum)) 
          Nun werden alle Falscheingaben abgefangen

          Comment


          • #6
            Und die nächsten Probleme

            Fall 1: veralteter Befehl eregi
            PHP Code:
            $mailadresse "test@testmail.de";

            if(
            eregi("^[_.0-9a-z-]+@([0-9a-z-]+.)+[a-z]{2,4}$",$mailadresse))
            {
               echo 
            "Mailadresse ist korrekt";
            }
            else
            {
               echo 
            "Mailadresse ist falsch";

            Die Überprüfung könnte man zwar abfangen mit:
            PHP Code:
            if(filter_var($mailadresseFILTER_VALIDATE_EMAIL))
            {
               echo 
            "Mailadresse ist korrekt";
            }
            else
            {
               echo 
            "Mailadresse ist falsch";

            aber ich brauche eine Lösung mit der ich die Domain vom Rest der Mailadresse trennen kann.


            Das zweite Problem was ich nicht in den Griff bekomme ist ähnlich:

            Ich habe eine Pfadvariable aus der die Datei getrennt werden muss.

            Bsp:
            PHP Code:
            $pfadbild "bilder/testbild.gif";

            // ich benötige nur den Teil "testbild.gif" 

            Comment


            • #7
              Für eregi kannst Du preg_match mit i Modifier benutzen, würde ich denken. Also "/Muster/i" und ich habe mal die Klammer versetzt:

              PHP Code:
              <?php

              $mailadresse 
              "test@testmail.de";

              if(
              preg_match("/^[_.0-9a-z-]+@([0-9a-z-]+\.+[a-z]{2,4})$/i",$mailadresse$erg))
              {
                 echo 
              "Ausgabe: <br>\n".
                      
              $erg[0]. "<br>\n".
                      
              $erg[1]."\n";
              }
              /*
              Ausgabe:
              test@testmail.de
              testmail.de
              */


              $pfadbild pathinfo("verzeichnis/ein-bild.jpg");

              echo 
              "Ausgabe: <br>\n".$pfadbild["filename"].".".$pfadbild["extension"]."\n";

              /*
              Ausgabe:
              ein-bild.jpg
              */

              ?>

              Comment


              • #8



                und nun gleich die nächste Frage, damit ich das vielleicht endlich mal kapiere

                Was muss ich verändern um folgende Ausgabe zu bekommen?

                PHP Code:
                /*
                Ausgabe:
                test@testmail.de
                test
                @
                testmail
                .
                de
                */ 
                Ich weiß, dass ich () Klammern um die Elemente setzen muss, aber was muss in die {} Klammern rein, weil ohne die, bekomme ich nur den 1. Buchstaben im Array.

                Comment


                • #9
                  Originally posted by Miranda View Post
                  Ich weiß, dass ich () Klammern um die Elemente setzen muss, aber was muss in die {} Klammern rein, weil ohne die, bekomme ich nur den 1. Buchstaben im Array.
                  0 enthält das gesamte Suchergebnis, welches eine Übereinstimmung mit dem regulären Ausdruck ergab, 1 bis x die Ergebnisse von den geklammerten Teilausdrücken.

                  PHP Code:
                  <?php

                  $mailadresse 
                  "test@testmail.de";

                  preg_match("/^([_.0-9a-z-]+)(@+)([0-9a-z-]+)(\.+)([a-z]{2,4})$/i",$mailadresse$treffer);

                      echo 
                  "<pre>";
                      
                  print_r($treffer);
                      echo 
                  "</pre>";
                  /*
                  Array
                  (
                      [0] => test@testmail.de
                      [1] => test
                      [2] => @
                      [3] => testmail
                      [4] => .
                      [5] => de
                  )    
                  */

                     
                  echo "Ausgabe: <br>\n".
                          
                  $treffer[0]. "<br>\n".   // 0 enthält das gesamte Suchergebnis
                          
                  $treffer[1]. "<br>\n".   // 1 bis ... die Ergebnisse von den geklammerten Teilausdrücken        
                          
                  $treffer[2]. "\n";       // usw.  
                  /*
                  Ausgabe:
                  test@testmail.de
                  test
                  @
                  */
                          
                  ?>

                  Comment


                  • #10
                    ah, jetzt weiß ich wo mein Fehler war

                    PHP Code:
                    // ich hatte erst die Klammern falsch gesetzt, nämlich so
                    if(preg_match("/^([_.0-9a-z-])+(@)+([0-9a-z-])+\(.)+([a-z]{2,4})$/i",$mailadresse$erg))

                    // und dachte, da fehlen die {} Klammern
                    // if(preg_match("/^([_.0-9a-z-]){x}....
                    // statt x natürlich eine Zahl

                    // das dann einfach das + mit in die Klammern muss, war mir nicht klar.
                    if(preg_match("/^([_.0-9a-z-]+)(@+)([0-9a-z-]+)(\.+)([a-z]{2,4})$/i",$mailadresse$erg)) 
                    Vielen Dank.

                    Habe ich das übrigens jetzt richtig verstanden?
                    PHP Code:
                    if(preg_match("/^([_.0-9a-z-]{2,10}+)(@+)([0-9a-z-]+)(\.+)([a-z]{2,4})$/i",$mailadresse$erg))
                    {
                       echo 
                    $erg[1];

                    // würde mir jetzt den String mit mindestens 2 und maximal 10 Zeichen ausgeben???

                    Comment


                    • #11
                      Im Bezug auf Prüfung einer eMail-Adresse auf korrektes Format, bringt PHP mittlerweile schon eigene Validatoren mit.

                      PHP Code:
                      $sEMail 'test@example.org';
                      if (
                      filter_var($sEMail FILTER_VALIDATE_EMAIL)) {
                          echo 
                      'eMail-Adresse ist valide.';
                      } else {
                          echo 
                      'eMail-Adresse ist nicht valide.';

                      Comment


                      • #12
                        *schmunzel*

                        das hatte ich oben geschrieben
                        aber aus dieser Variante kann ich keine Teile der Mail rausziehen.
                        Dafür brauche ich also weiterhin preg_match.

                        Und so langsam steige ich auch durch, dank der Hilfe von euch beiden.

                        Comment


                        • #13
                          Wobei man dann vielleicht noch @{1} und \.{1} statt @+ und \.+ verwenden könnte, da ja @ und Punkt nur einmal vorkommen sollten und nicht + (einmal oder mehrmals).

                          PHP Code:
                          <?php
                          $mailadresse 
                          "test@testmail.de";

                          if(
                          preg_match("/^[_.0-9a-z-]+@{1}([0-9a-z-]+\.{1}[a-z]{2,4})$/i",$mailadresse$erg))
                          {
                             echo 
                          "Ausgabe: <br>\n".
                                  
                          $erg[0]. "<br>\n".
                                  
                          $erg[1]."\n";
                          }
                          /*
                          Ausgabe:
                          test@testmail.de
                          testmail.de
                          */
                          ?>

                          Comment


                          • #14
                            Originally posted by Miranda View Post
                            *schmunzel*

                            das hatte ich oben geschrieben
                            aber aus dieser Variante kann ich keine Teile der Mail rausziehen.
                            Dafür brauche ich also weiterhin preg_match.

                            Und so langsam steige ich auch durch, dank der Hilfe von euch beiden.
                            Ah Sorry hatte den Abschnitt wohl überlesen.
                            Dennoch sollte man bei Patterns wie den obigen in Bezug auf Domainendungen aufpassen, da bei den neuen Toplevel-Domains unter Umständen Domainendungen auftauchen könnten, welche länger als 4 Zeichen sind (z.B. Städtenamen als Endung ".hamburg"),
                            Last edited by CPCoder; 07-04-2013, 00:03.

                            Comment


                            • #15
                              Danke für den Hinweis mit den neuen Domainendungen

                              Originally posted by Miranda View Post
                              Habe ich das übrigens jetzt richtig verstanden?
                              PHP Code:
                              if(preg_match("/^([_.0-9a-z-]{2,10}+)(@+)([0-9a-z-]+)(\.+)([a-z]{2,4})$/i",$mailadresse$erg))
                              {
                                 echo 
                              $erg[1];

                              // würde mir jetzt den String mit mindestens 2 und maximal 10 Zeichen ausgeben???

                              Wenn ich das oben im Zitat richtig verstanden habe, dann müsste ich also einfach nur statt der {2,4} bei der Domainendung die 4 z.B. mit 10 austauschen. Richtig?

                              Comment

                              Working...