WernerK: RegEx für email Adresse (Name mit Bindestrich und Punkt)

Hallo,
ich hatte bisher folgende regexe zum prüfen einer email adresse:

$email_flag=preg_match("!^\w[\w|.|-]+@\w[\w|.|-]+.[a-zA-Z]{2,4}$!",$email);

Dieses scheitert aber wenn der Name wie folgt ist, also mit Bindestrich im Vornamen getrennt von einem Punkt mit Nachname.

hans-peter.meier@meineadresse.de

Ich komme nicht drauf wie man das anpassen muss.

Hat jemand eine Idee?

vielen Dank
WernerK

  1. @@WernerK:

    nuqneH

    ich hatte bisher folgende regexe zum prüfen einer email adresse: […]
    Hat jemand eine Idee?

    Ja: .+@.+..+ Alles andere ist Unsinn.

    BTW, PHP bietet Validierungsfilter. Der für E-Mail-Adressen arbeitet falsch.

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)
    1. Hallo,

      Ja: .+@.+..+ Alles andere ist Unsinn.

      auch nur bedingt einsetzbar: root@localhost fällt durch.
      Sollte man überhaupt mehr als .+@.+ verlangen?

      Ciao,
       Martin

      --
      Er war ein Mann wie ein Baum. Sie nannten ihn Bonsai.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. [latex]Mae  govannen![/latex]

        Ja: .+@.+..+ Alles andere ist Unsinn.

        auch nur bedingt einsetzbar: root@localhost fällt durch.

        Solche Adressen sind nur für Applikationen in internen Netzen interessant, im Web funktionieren sie ohnehin nicht. Insofern ist es meist irrelevant, wenn sie blockiert werden.

        Solange der OP nicht explizit ein internes Netzwerk (--> Tipps für Fragende) erwähnt… :)

        Stur lächeln und winken, Männer!
        Kai

        --
        Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
        in Richtung "Mess up the Web".(suit)
        SelfHTML-Forum-Stylesheet
      2. Hallo,

        vielen Dank für die Tipps und Ratschläge.

        Sollte man überhaupt mehr als .+@.+ verlangen?

        Mir ist klar das eine umfangreiche email Adress Validierung vermutlich sehr schwierig ist bzw. so einfach garnicht machbar ist. Zumal wenn dann noch französische oder spanische Namen dazukommen.

        danke nochmals
        Gruss
        Werner

        1. Ich muss doch nochmals nachfragen,

          ich habe mal eure Links und Tipps vom Forum hier ausprobiert.

          Selbst wenn ich eine ganz einfache Prüfung mache:

          /^.+@.+..+$/i

          Dann wird die Adresse:

          hans-peter.meier@muster.de

          nicht erlaubt.
          Mir ist nicht ganz klar warum. Wenn ich es richtig verstehe bedeutet doch;

          .+@

          beliebige Zeichen, einmal oder mehrmals vor dem @ Zeichen?
          Nach dem @ Zeichen nochmals mit .+ beliebige Zeichen bis zum Punkt.

          Warum wird die obige Adresse trotzdem blockiert?

          Danke
          Gruss
          Werner

          1. Hi,

            /^.+@.+..+$/i
            Dann wird die Adresse:
            hans-peter.meier@muster.de
            nicht erlaubt.

            Der Regex matcht. Du machst also irgendwas anderes falsch. Wie wertest Du das denn aus?
            Steht im zu testenden String wirklich nur die E-Mail-Adresse? Oder vielleicht doch noch ein Zeilenumbruch?

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
            1. Hallo,

              also ich mach das so:
              define (EMAIL, "/^.+@.+..+$/i");
              ...
              if(strlen($_POST['email']) >= 0 and !preg_match(EMAIL, $_POST['email'])){
              echo "Email falsche Syntax"
              }

              Nach Eingabe von der Adresse
              hans-peter.meier@test.de

              und dem Submit kommt ständig "Email falsche Syntax".
              Sobald ich den Bindestrich weglasse, match der Regex

              komisch oder?

              gruss
              Werner

              1. Hi,

                define (EMAIL, "/^.+@.+..+$/i");

                achte auf die besondere Bedeutung des Backslashes in double-quoted Strings! Kann sein, dass die Sequenz . hier tatsächlich als Backslash und ein Punkt aufgelöst wird, weil die Kombination . keine Sonderbedeutung in einem PHP-String hat. Korrekt ist es aber nicht.

                if(strlen($_POST['email']) >= 0 and !preg_match(EMAIL, $_POST['email'])){
                echo "Email falsche Syntax"
                }

                Was willst du mit strlen()>=0 herausfinden? Nichts, denn strlen() liefert *immer* einen Wert größer oder gleich 0. Vermutlich meintest du hier ein einfaches "größer". Besser wäre dafür aber die Abfrage if (!empty($_POST['email']) ...), denn die hat den zusätzlichen Charme, dass sie keine Fehlermeldung (Notice) produziert, wenn $_POST['email'] nicht existiert.
                Und vermutlich meintest du hier ein logisches ODER, kein UND. Denn wenn ich einen Leerstring übergebe, ist schon die korrigierte erste Bedingung strlen()>0 nicht erfüllt, die zweite wird gar nicht mehr ausgewertet.

                hans-peter.meier@test.de

                Bitte verwende für Beispiele entweder deine eigene Domain, oder eine der dafür vorgesehenen. Die Stiftung Warentest besitzt vermutlich eine der am häufigsten missbrauchten Domains und wird darüber nicht begeistert sein.

                Sobald ich den Bindestrich weglasse, match der Regex

                Hast du dir mal den in $_POST['email'] übergebenen String angesehen? Ich wüsste zwar nicht, warum - aber vielleicht spielt da noch irgendeine seltsame Maskierung mit rein.

                komisch oder?

                Ja, sehr.

                Ciao,
                 Martin

                --
                F: Wer ist der Herrscher über Wasser, Wind und Wellen?
                A: Der Friseur.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Hallo,

                  jetzt habe ich es zum Testen mal geändert:

                  define (EMAIL, '/^.+@.+..+$/i');
                  if(!preg_match(EMAIL, $_POST['email'])){

                  echo "Die email ist -" .$_POST['email']. "- <br>";
                  echo "Email falsche Syntax"
                  }

                  trotzdem funktioniert es nur wenn ich den Bindestrich im Vornamen rausnehme
                  Die Echo Kontroller zeigt aber den Namen richtig an, also ohne Umbruch.

                  Die email ist -hans-peter.meier@example.com-

                  ich glaub ich gebs auf.

                  Gruss
                  Werner

                  1. [latex]Mae  govannen![/latex]

                    jetzt habe ich es zum Testen mal geändert:

                    define (EMAIL, '/^.+@.+..+$/i');
                    if(!preg_match(EMAIL, $_POST['email'])){

                    echo "Die email ist -" .$_POST['email']. "- <br>";
                    echo "Email falsche Syntax"
                    }

                    trotzdem funktioniert es nur wenn ich den Bindestrich im Vornamen rausnehme
                    Die Echo Kontroller zeigt aber den Namen richtig an, also ohne Umbruch.

                    Die email ist -hans-peter.meier@example.com-

                    ich glaub ich gebs auf.

                    Du machst auf deinem System etwas anders als du es uns hier erzählst. Jedenfalls würde obiger Code oder der Code aus https://forum.selfhtml.org/?t=208022&m=1414553 so gar nicht laufen, weil er einen Syntax-Fehler enthält (und außerdem noch eine Warnung wirft). Wenn man diese Fehler behebt, funktioniert obiger Code hier jedenfalls mit der von dir gewünschten Adresse einwandfrei.

                    Schlussfolgerung: Dein verwendeter Code muß also anders sein als der hier gepostete.

                    Stur lächeln und winken, Männer!
                    Kai

                    --
                    Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
                    in Richtung "Mess up the Web".(suit)
                    SelfHTML-Forum-Stylesheet
                    1. Also wenn du auf das fehlende Semikolon bei der Echo Ausgabe ansprichts,
                      dann war das ein Fehler hier beim posten.

                      define (EMAIL, '/^.+@.+..+$/i');
                      if(!preg_match(EMAIL, $_POST['email'])){
                      echo "Falsche Email Adresse";
                      }

                      so gibt es bei mir keinen Syntax Error

                      Ich weiss trotzdem nicht warum das Regex bei mir nicht greift.

                      Gruss
                      Werner

                      1. Was mir noch einfällt.

                        Könnte es daran liegen das ich die ganze PHP Seite in UTF-8 ausliefere?

                        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

                        Gruss
                        Werner

                        1. Hallo,

                          Könnte es daran liegen das ich die ganze PHP Seite in UTF-8 ausliefere?

                          nein, nicht bei den Beispielen, die du genannt hast. Sowohl dein RegEx, als auch die Mailadresse, die du zum Testen verwendet hast, besteht ausschließlich aus ASCII-Zeichen; die sehen auch in der UTF-8-Codierung Bit für Bit exakt gleich aus.

                          <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

                          Ist dir bewusst, dass diese Angabe vermutlich nur Zierde ist? Sie dient nur als Ersatzangabe für den Fall, dass der Server keine Angabe zur Zeichencodierung macht (oder das Dokument nicht per HTTP übertragen wird). Sobald aber der Server im HTTP-Header eine andere Angabe macht, hat die Vorrang.

                          Ciao,
                           Martin

                          --
                          Soso, der Klügere gibt nach.
                          Aber warum sollen sich immer nur die Dummen durchsetzen?  .oO(?)
                          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      3. Hi,

        Ja: .+@.+..+ Alles andere ist Unsinn.
        auch nur bedingt einsetzbar: root@localhost fällt durch.
        Sollte man überhaupt mehr als .+@.+ verlangen?

        Im Normalfall will man keine lokalen Adressen haben, also ja - die Prüfung auf mindestens einen Punkt im Domainpart ist in den meisten Fällen sinnvoll.

        Als weitergehende Prüfung der Domain würde ich aber nicht syntaktische Prüfung machen, sondern eher eine DNS-Anfrage, um die Existenz der Domain zu überprüfen. Und ggf. auch gucken, ob ein MX-Record existiert.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Tach,

          Als weitergehende Prüfung der Domain würde ich aber nicht syntaktische Prüfung machen, sondern eher eine DNS-Anfrage, um die Existenz der Domain zu überprüfen. Und ggf. auch gucken, ob ein MX-Record existiert.

          ein MX-Record ist zum Empfang von Mails nicht nötig, ein A-Record reicht.

          mfg
          Woodfighter

  2. Hi,

    ich hatte bisher folgende regexe zum prüfen einer email adresse:

    schade eigentlich.

    $email_flag=preg_match("!^\w[\w|.|-]+@\w[\w|.|-]+.[a-zA-Z]{2,4}$!",$email);

    a@example.com wird abgelehnt.
    a|||@example.com wird durchgelassen.
    a.@example.com wird durchgelassen.
    a..b@example.com wird durchgelassen.
    abc@example.museum wird abgelehnt.

    Ich komme nicht drauf wie man das anpassen muss.

    Und Deine Suche nach Überprüfung von E-Mail-Adressen war nicht erfolgreich? Weder im Netz, noch hier im Forumsarchiv?

    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. Hi,

      $email_flag=preg_match("!^\w[\w|.|-]+@\w[\w|.|-]+.[a-zA-Z]{2,4}$!",$email);

      a|||@example.com wird durchgelassen.

      warum auch nicht?

      das Pipe-Zeichen ist im localpart an genau den Stellen zulässig, an denen auch ein Buchstabe, eine Ziffer,  ein Minuszeichen (und noch einige andere) zulässig sind.

      auch |||.---.|||@example.com ist formal zulässig. Man kann also Morse-Code als E-Mail-Adressen-Localpart haben (mit | für Kurz, - für Lang, und . für Zeichentrenner)

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      1. Hi,

        $email_flag=preg_match("!^\w[\w|.|-]+@\w[\w|.|-]+.[a-zA-Z]{2,4}$!",$email);
        a|||@example.com wird durchgelassen.
        warum auch nicht?

        warum fragst Du?

        Aufgrund der doppelten Nennung des Zeichens, das an einer anderen Stelle der RegExp auch noch die Bedeutung "oder" hätte, gehe ich davon aus, dass der OP dieses Ergebnis nicht erwartet hätte.

        auch |||.---.|||@example.com ist formal zulässig. Man kann also Morse-Code als E-Mail-Adressen-Localpart haben (mit | für Kurz, - für Lang, und . für Zeichentrenner)

        Mit speziell diesem Localpart der E-Mail-Adresse solltest Du sparsam umgehen. Es gibt genügend Leute, die nicht wissen, dass das als "SOS" bezeichnete Notsignal aus nur einem einzigen Zeichen besteht, und somit trotz der Zeichentrenner diese Adresse als Notrufempfänger oder -absender fehlinterpretieren könnten ;-)

        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
  3. Moin Moin!

    Siehe auch Validierung von eMail-Adressen (Selfforumssieb).

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".