Ankündigung

Einklappen
Keine Ankündigung bisher.

Regular Expression Verständnissproblem

Einklappen

Neue Werbung 2019

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

  • Regular Expression Verständnissproblem

    Hallo zusammen,

    ich möchte gerne folgende Regular Expression genauer verstehen:
    ^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9üöä-]+(\.[a-z0-9üöä-]+)*\.([a-z]{2,4})$^

    bzw. ich denke ich verstehe sie falsch. Hier mal meine Annahmen:
    - String muss mit Kleinbuchstaben, Zahlen, _ + oder - beginnen
    - darauf folgt ein . (nicht zwingend)
    - dann wieder kleinbuchstaben und Zahlen, _ + oder -
    - dann muss zwingend ein @ kommen
    - es folgen Kleinbuchstaben, zahlen oder öäü
    - ein möglicher punkt und wieder kleinbuchstaben zahlen oder öäü
    - ein zweingender punkt und 2-4 kleinbuchstaben

    soweit so gut, nun habe ich mir ein kleines PHP-Skript gebastelt um das ganze zu überprüfen:
    PHP-Code:
        function validemail($email)
        {

            
    $email_reg "^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9üöä-]+(\.[a-z0-9üöä-]+)*\.([a-z]{2,4})$^";
            
            if (
    preg_match($email_regstrtolower($email))){
                echo(
    'gültig: ');
                echo(
    $email);
                echo(
    '<br />');
            }
            else{
                echo(
    'ungültig: ');
                echo(
    $email);
                echo(
    '<br />');
            }
        }
        
    $email $_POST['mail'];
        
        
    validemail($email); 

    Bei der Eingabe
    - xyz.ddj
    wird auch wie erwartet ungültig ausgegeben und bei

    - xyz.test@mail.de
    wie erwartet gültig


    Wenn ich hier folgende Strings durchjage werden diese jedoch als gültig angezeigt und das verstehe ich nicht ganz:

    - ea?e.,12345!"$§%&/$()=?sdfjs@wev.de
    (hier sind doch viel zu viele Zeichen drin, die die Regex gar nicht durchlassen dürfte, z.B: $ oder ?

    - eöe.väv@mail.de
    (hier kommen ja vor dem @ Zeichen bereits ö und ä - die sind doch laut regular expression erst in der domain erlaubt?!)



    Wäre über eine kurze Aufklärung sehr Dankbar, anscheinend hab ich grad ein Brett vorm Kopf


  • #2
    Ohne es im Detail angesehen zu haben... Schau dir das mal an, ev. reicht das schon zu deinem Problem?
    http://php-de.github.io/jumpto/stand...il-validation/

    Ansonsten ev. noch den /u Modifier anschauen. http://php.net/manual/de/reference.p....modifiers.php

    LG
    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      vielen Dank für die schnelle Antwort

      Leider hilft mir das nicht weiter,
      mir geht es auch nicht darum ob diese Regular Expression gut oder schlecht ist, oder welche fertigen Funktionen es zur Überprüfung von E-Mail Adressen geben würde,

      sondern mir geht es nur darum die oben gepostete Regular Expression zu verstehen bzw. zu herauszufinden wo genau mein Denkfehler steckt

      LG

      Kommentar


      • #4
        Zitat von Cookie169 Beitrag anzeigen
        - ea?e.,12345!"$§%&/$()=?sdfjs@wev.de
        (hier sind doch viel zu viele Zeichen drin, die die Regex gar nicht durchlassen dürfte, z.B: $ oder ?
        Da ist ein String drin auf den der Ausdruck passt - davon dass davor und dahinter nichts anderes stehen darf steht in deinem Ausdruck nichts.

        Zitat von Cookie169 Beitrag anzeigen
        mir geht es auch nicht darum ob diese Regular Expression gut oder schlecht ist, oder welche fertigen Funktionen es zur Überprüfung von E-Mail Adressen geben würde,
        Zum Überprüfen von E-Mailadressen taugt der Ausdruck nichts (schon alleine daher weil es Endungen mit mehr als vier Buchstaben gibt, auch sind sowohl vor als auch nach dem @ *wesentlich* mehr Zeichen erlaubt). Es gäbe noch die Funktion filter_var() wobei auch die (laut User-Kommentaren) nicht alles zulässt was erlaubt ist - schau einfach ob ein @ vorkommt, ob der User eine gültige (und seine eigene) E-Mailadresse angegeben hat kannst du ohnehin nicht rausbekommen, ggf. musst du ihm eben eine Mail mit einem Bestätigungslink schicken.

        Kommentar


        • #5
          Es gäbe noch die Funktion filter_var() wobei auch die (laut User-Kommentaren) nicht alles zulässt was erlaubt ist
          Vor allem die hierzulande üblchen und mittlerweile möglichen/erlaubten Umlaute, ß, da ist eine Punycodewandlung ( http://php-de.github.io/jumpto/stand...omainnamen-idn ) vorher nötig.

          schau einfach ob ein @ vorkommt, ob der User eine gültige (und seine eigene) E-Mailadresse angegeben hat kannst du ohnehin nicht rausbekommen, ggf. musst du ihm eben eine Mail mit einem Bestätigungslink schicken.
          Würde ich auch so machen, eine lose Rahmenprüfung in der Art: http://php-de.github.io/jumpto/stand...usdrcken-regex

          Abgesehen davon in Bezug auf den Eröffnungspost würde ich andere Delimiter als ^ verwenden, was ich auf die Schnelle im Kopf habe, ist das ^ doch Stringbeginn ev. stimmt das schon nicht ganz, weiß ich aber nicht 100%ig sicher ausm Kopf.
          LG
          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Zitat von Cookie169 Beitrag anzeigen
            ^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9üöä-]+(\.[a-z0-9üöä-]+)*\.([a-z]{2,4})$^
            Hier ist schon das Problem, dass du das Zirkumflex als Delimiter verwendest.

            PHP-Code:
            $email 'ea?e.,12345!"$§%&/$()=?sdfjs@wev.de';
            preg_match('^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9üöä-]+(\.[a-z0-9üöä-]+)*\.([a-z]{2,4})$^'$email$match);
            var_dump($match);

            array(
            4) {
              [
            0] =>
              
            string(12"sdfjs@wev.de"
              
            [1] =>
              
            string(0""
              
            [2] =>
              
            string(0""
              
            [3] =>
              
            string(2"de"

            Wenn die Raute als Delimiter verwendet wird, und der restliche Reguläre Ausdruck korrekt in ^ und $ umschlossen wird passt es:

            PHP-Code:
            $email 'ea?e.,12345!"$§%&/$()=?sdfjs@wev.de';
            preg_match('#^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9üöä-]+(\.[a-z0-9üöä-]+)*\.([a-z]{2,4})$#'$email$match);
            var_dump($match);
            array(
            0) {


            Sofern du [MAN]intl[/MAN] oder idn installiert hast, sollte es einfach wie folgt funktionieren:
            PHP-Code:
            function email_to_idn($email) {
                
            $parts explode('@'$email2);
                if(
            array_key_exists(1$parts)) {
                    
            $parts[1] = idn_to_ascii($parts[1]);
                }
                return 
            implode('@'$parts);
            }

            function 
            email_to_utf8($email) {
                
            $parts explode('@'$email2);
                if(
            array_key_exists(1$parts)) {
                    
            $parts[1] = idn_to_utf8($parts[1]);
                }
                return 
            implode('@'$parts);
            }

            function 
            email_validate($email) {
                
            $idn email_to_idn($email);
                
            $result filter_var($idnFILTER_VALIDATE_EMAIL);
                return 
            $result !== false;
            }

            $email 'xyz.ddj';
            var_dump(email_validate($email));

            $email 'xyz.test@mail.de';
            var_dump(email_validate($email));

            $email 'ea?e.,12345!"$§%&/$()=?sdfjs@wev.de ';
            var_dump(email_validate($email));

            $email 'eöe.väv@mail.de';
            var_dump(email_validate($email)); 
            Code:
            bool(false)
            bool(true)
            bool(false)
            bool(false)

            Kommentar


            • #7
              Ein Detail:

              Bei Nicht-ASCII-Zeichen (hier etwa "äöü") in Character-Klassen in Regex-Patterns ohne u-Pattern-Modifier sollten immer die Alarmglocken läuten.

              Wenn die Quellcode-Datei in dem Fall nicht UTF-8-kodiert ist und das Script auch nicht mit UTF-8-Eingaben arbeitet, funktioniert das zwar wie erwartet, aber Scripts, die mit ISO-8859-1 oder Windows-1252 arbeiten, sind nicht mehr zeitgemäß.

              Ist die Quellcode-Datei in UTF-8 kodiert, ist "/[äöü]*/" (meines Wissens) äquivalent zu "/[\xC3\xA4\xC3\xB6\xC3\xBC]*/" und würde jede Kombination dieser vier verschiedenen Bytes matchen. Eingaben wie \xA4\xA4\xC3\xC3 sind jedoch kein gültiges UTF-8.

              Also bei so was immer den u-Modifier setzen oder zum Beispiel mit Unicode character properties arbeiten, um die möglichen Eingaben nicht nur auf deutsche „Sonderzeichen“ zu begrenzen.

              - http://php.net/manual/en/reference.p....modifiers.php
              - http://php.net/manual/en/regexp.reference.unicode.php

              Kommentar

              Lädt...
              X