Problem mit preg_match statt ereg nach PHP Umstellung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 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.";

    Kommentar


    • #3
      danke @Melewo

      Habe alle 3 Probleme hinbekommen

      Kommentar


      • #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
         * )
         */ 
        Zuletzt geändert von CPCoder; 02.04.2013, 21:43.

        Kommentar


        • #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

          Kommentar


          • #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" 

            Kommentar


            • #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
              */

              ?>

              Kommentar


              • #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.

                Kommentar


                • #9
                  Zitat von Miranda Beitrag anzeigen
                  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
                  @
                  */
                          
                  ?>

                  Kommentar


                  • #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???

                    Kommentar


                    • #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.';

                      Kommentar


                      • #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.

                        Kommentar


                        • #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
                          */
                          ?>

                          Kommentar


                          • #14
                            Zitat von Miranda Beitrag anzeigen
                            *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"),
                            Zuletzt geändert von CPCoder; 07.04.2013, 01:03.

                            Kommentar


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

                              Zitat von Miranda Beitrag anzeigen
                              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?

                              Kommentar

                              Lädt...
                              X