Peter Thomassen: Zu testen: RegExp für e-mail-Syntax

Hallo Forum,

es wurde schon hundertmal diskutiert, und jetzt brauche ich es
selber: Einen regulären Ausdruck, um die syntaktische Korrektheit
von e-mail-Adressen zu testen.

Es gibt Leute mit der Meinung, dazu sei ein mehrere Seiten langer
regulärer Ausdruck nötig - meiner ist 57 Bytes lang. Da ich ihn
aber für soooo genial halte, möchte ich ihn nicht veröffentlichen,
sondern darum bitten ihn zu testen:

http://www.a4a.de/temp/check.php?check=[Adresse]

Wer Lust hat, kann das ja mal tun. Der Check des Teils nach dem
letzten AT ist noch total unausgereift (so weit ich weiß, sind ja
laut RFC 819 sogar mehrere ATs erlaubt), also bitte verzeit mir,
wenn mit der Prüfung des Domainnamens etwas nicht stimmen sollte.

Meine Informationen für die Entwicklung des Ausdrucks habe ich
aus http://www.faqs.org/rfcs/rfc819.html, Appendix A bezogen.

Deshalb zum Schluss noch eine Frage:
Ein Zeichen <c> im Sinne dieser RFC ist ein beliebiges der 128
ASCII-Zeichen, allerdings außer <s>. <s> ist so definiert:

<s> ::= "<", ">", "(", ")", "[", "]", "", ".", ",", ";", ":", "@",
  """, and the control characters (ASCII codes 0 through 31 inclusive
  and 127)

Heißt das also, dass unescaped keine Punkte in dem Teil vor dem
letzten AT vorkommen dürfen?!

Danke schomal,
Peter ;-)

--
Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
  1. *argh* ....

    http://www.a4a.de/temp/check.php?check=[Adresse]

    Für die Kligga:

    <http://www.a4a.de/temp/check.php?check=<Adresse>>

    Bye,
    Peter

    --
    Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
    1. Hi,

      <http://www.a4a.de/temp/check.php?check=<Adresse>>

      Nochmal *argh* ;o)

      Also so ganz ausgereift ist der RegExp aber nicht:
      http://www.a4a.de/temp/check.php?check=bla.blaubb@buldd.info
      Die Mail-Adresse bla.blaubb@buldd.info soll invalide sein?
      Imho ist diese aber valide...

      Viele Grüße...

      Alex :)

      1. Hallo Alexander,

        <http://www.a4a.de/temp/check.php?check=<Adresse>>

        Nochmal *argh* ;o)

        Stimmt ;-)

        Also so ganz ausgereift ist der RegExp aber nicht:
        http://www.a4a.de/temp/check.php?check=bla.blaubb@buldd.info
        Die Mail-Adresse bla.blaubb@buldd.info soll invalide sein?
        Imho ist diese aber valide...

        Lies mal den unteren Teil von [pref:t=35917&m=196225].

        Bye,
        Peter

        --
        Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
  2. Hallo Peter,

    Da ich ihn aber für soooo genial halte, möchte ich ihn nicht veröffentlichen,

    wenn du meinst...

    http://www.a4a.de/temp/check.php?check=[Adresse]

    sorry aber er taugt nichts, meine fh-adresse ist laut deinem Ausdruck nicht valide (die hat das muster bla.bla@student.fh-nuernberg.de)

    aber warum verwendest du nicht einfach sowas wie "^.{2,}@.{2,}..{2,10}$"? zwei Zeichen vor dem @, zwei zwischen @ und Punkt und zwei bist zehn nach dem Punkt. (da dürften alle Möglichkeiten drin sein - man möge mich korrigieren, wenn es nicht stimmt :-))

    Grüße aus Nürnberg
    Tobias

    1. Hallo Tobias,

      http://www.a4a.de/temp/check.php?check=[Adresse]
      sorry aber er taugt nichts, meine fh-adresse ist laut deinem Ausdruck nicht valide (die hat das muster bla.bla@student.fh-nuernberg.de)

      Lies mal [pref:t=35917&m=196225], ganz unten. Entweder hab ich die RFC
      falsch verstanden, oder ist wirklich nicht erlaubt. Wenn ich es
      erlauben wollte, wäre der Ausdruck übrigens noch ein Byte kürzer.

      aber warum verwendest du nicht einfach sowas wie "^.{2,}@.{2,}..{2,10}$"? zwei Zeichen vor dem @, zwei zwischen @ und Punkt und zwei bist zehn nach dem Punkt. (da dürften alle Möglichkeiten drin sein - man möge mich korrigieren, wenn es nicht stimmt :-))

      Weil ich gerne mal damit herumspielen und wissen wollte, ob der
      wirklich zwei Seiten lang sein muss.

      Bye,
      Peter

      --
      Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
    2. Moin!

      aber warum verwendest du nicht einfach sowas wie "^.{2,}@.{2,}..{2,10}$"? zwei Zeichen vor dem @, zwei zwischen @ und Punkt und zwei bist zehn nach dem Punkt. (da dürften alle Möglichkeiten drin sein - man möge mich korrigieren, wenn es nicht stimmt :-))

      Auch dieser Ausdruck ist fehlerhaft. :)

      Eine Useradresse muß nicht zwei Zeichen lang sein - eines ist Minimum.
      Eine Subdomain ist auch minimal ein Zeichen lang. http://www.x.org
      Lediglich bei der Top-Level-Domain sind aufgrund der derzeitigen Definitionen zwei Zeichen als Minimum anzunehmen (die Zwei-Zeichen-Ländercodes nämlich), längere Ausdrücke sind aber möglich (.com, .info, .museum).

      Ein wirklich "guter" (wenn man die entsprechenden Anforderungen stellt) regulärer Ausdruck prüft also sowas:

      /^.*@.+..{2,}$/

      Was da angemeckert wird, ist mit Sicherheit _keine_ gültige Mailadresse. Alles, was durchkommt, erfüllt zumindest ein Minimum an Anforderungen.

      Wenn man das Prüfraster von diesem Punkt ausgehend weiter einschränkt, läuft man Gefahr, benutzbare EMail-Adressen auszuschließen.

      - Sven Rautenberg

      --
      "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
      1. Hallo Sven,

        /^.*@.+..{2,}$/

        [...]

        Wenn man das Prüfraster von diesem Punkt ausgehend weiter einschränkt, läuft man Gefahr, benutzbare EMail-Adressen auszuschließen.

        Hast Du mit meinem Ausdruck eine gefunden, die gültig ist und
        von meinem Script als ungültig ausgewiesen wurde, oder umgekehrt?

        Danke!
        Peter

        --
        Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
        1. Moin!

          Hast Du mit meinem Ausdruck eine gefunden, die gültig ist und
          von meinem Script als ungültig ausgewiesen wurde, oder umgekehrt?

          Ja. Wie andere in diesem Thread auch. Und du hast das mit Verweis auf "Domainerkennung läuft noch nicht" abgetan.

          Mit anderen Worten: Was soll man da testen? Wenn's noch nicht gehen soll, kann man nichts testen. Wenn's gehen soll, und es geht falsch, kann man testen.

          - Sven Rautenberg

          --
          "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
          1. Hallo Sven,

            Hast Du mit meinem Ausdruck eine gefunden, die gültig ist und
            von meinem Script als ungültig ausgewiesen wurde, oder umgekehrt?

            Ja. Wie andere in diesem Thread auch. Und du hast das mit Verweis auf "Domainerkennung läuft noch nicht" abgetan.

            Mit anderen Worten: Was soll man da testen? Wenn's noch nicht gehen soll, kann man nichts testen. Wenn's gehen soll, und es geht falsch, kann man testen.

            Das hab ich jetzt mal korrigiert ... hatte aber nichts mit der
            Domainerkennung zu tun, sondern damit, dass ich die RFC so ver-
            standen habe, dass keine Punkte vor dem @ erlaubt sind. Ich hab
            das jetzt mal korrigiert, und die Domainerkennung ist evtl. noch
            ein bisschen zu "durchlässig". Aber sonst?

            Bye,
            Peter

            --
            Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
            1. Moin!

              Das hab ich jetzt mal korrigiert ... hatte aber nichts mit der
              Domainerkennung zu tun, sondern damit, dass ich die RFC so ver-
              standen habe, dass keine Punkte vor dem @ erlaubt sind. Ich hab
              das jetzt mal korrigiert, und die Domainerkennung ist evtl. noch
              ein bisschen zu "durchlässig". Aber sonst?

              Ok, die Mailadressen, die vorher fälschlich ungültig waren, gehen jetzt durch.

              Aber du erlaubst keine Mailadressen @ ip-adresse:

              x@123.45.67.8 ist angeblich ungültig, sollte es aber nicht sein.

              Ansonsten: Dein Ausdruck dürfte sich doch eigentlich nur minimal von meinem unterscheiden. Fehlalarme habe ich (außer bei IP-Adressen) nicht provozieren können.

              - Sven Rautenberg

              --
              "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
              1. Hallo Sven,

                Das hab ich jetzt mal korrigiert ... hatte aber nichts mit der
                Domainerkennung zu tun, sondern damit, dass ich die RFC so ver-
                standen habe, dass keine Punkte vor dem @ erlaubt sind. Ich hab
                das jetzt mal korrigiert, und die Domainerkennung ist evtl. noch
                ein bisschen zu "durchlässig". Aber sonst?

                Ok, die Mailadressen, die vorher fälschlich ungültig waren, gehen jetzt durch.

                Aber du erlaubst keine Mailadressen @ ip-adresse:

                x@123.45.67.8 ist angeblich ungültig, sollte es aber nicht sein.

                Danke, das ist korrigiert. Wie gesagt, das nach dem @ ist gerade
                sehr, sehr durchlässig (es müssen keine Punkte enthalten sein
                etc.).

                Ansonsten: Dein Ausdruck dürfte sich doch eigentlich nur minimal von meinem unterscheiden. Fehlalarme habe ich (außer bei IP-Adressen) nicht provozieren können.

                Wenn vor dem @ etwas nicht stimmt, sagt meiner aber IMHO immer,
                dass es nicht stimmt. Deiner tut das nicht ... oder hast Du
                ein ungültiges Beispiel, das bei meinem Ausdruck gültig ist?

                Bye,
                Peter

                --
                Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
            2. Hallo Peter,

              Das hab ich jetzt mal korrigiert ... hatte aber nichts mit der
              Domainerkennung zu tun, sondern damit, dass ich die RFC so ver-
              standen habe, dass keine Punkte vor dem @ erlaubt sind. Ich hab

              *lol* Du hast also die RFC so verstanden, daß _Deine_ _eigene_ Adresse ungültig ist...
              Peter.Thomassen@gmx.de
              Oder ist die falsch?

              Gruss,

              Vinzenz

      2. Hallo Sven,

        aber warum verwendest du nicht einfach sowas wie "^.{2,}@.{2,}..{2,10}$"?
        Eine Useradresse muß nicht zwei Zeichen lang sein - eines ist Minimum.

        achso, das wusste ich nicht, dann könnte man doch das erste {2,} einfach auf {1,} kürzen (bzw. dann tut es glaube ich auch ein '+')

        Eine Subdomain ist auch minimal ein Zeichen lang. http://www.x.org

        das ist doch keine Subdomain mit einem Zeichen oder? Das ist doch die domain x.org mit der Subdomain www, oder habe ich was falsch verstanden?
        mhh... irgendwie kommt die adresse aa@x.org durch meine Ausdruck durch *rätsel*

        Ein wirklich "guter" (wenn man die entsprechenden Anforderungen stellt) regulärer Ausdruck prüft also sowas:

        /^.*@.+..{2,}$/

        das heißt doch "0 bis oo Zeichen vor dem @, mindestens ein Zeichen nach dem @ und mindestens zwei Zeichen nach dem Letzten Punkt", oder?

        Grüße aus Nürnberg
        Tobias

        1. Hi,

          aber warum verwendest du nicht einfach sowas wie "^.{2,}@.{2,}..{2,10}$"?
          Eine Useradresse muß nicht zwei Zeichen lang sein - eines ist Minimum.
          achso, das wusste ich nicht, dann könnte man doch das erste {2,} einfach auf {1,} kürzen (bzw. dann tut es glaube ich auch ein '+')
          mhh... irgendwie kommt die adresse aa@x.org durch meine Ausdruck durch *rätsel*

          Wieso? 2 Zeichen, @, mindestens 2 beliebige Zeichen (x.), gefolgt von einem beliebigen Zeichen (o) gefolgt von 2 bis 10 beliebigen Zeichen (rg)

          . matcht ein beliebiges Zeichen.

          ^.{2,}@.{2,}..{2,10}$
                      ^
          An der markierten Stelle meintest Du wohl .

          Aber dann wäre a@127.0.0.1 nicht möglich...

          cu,
          Andreas

          --
          Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
          1. Hallo Andreas,

            ^.{2,}@.{2,}..{2,10}$
                        ^
            An der markierten Stelle meintest Du wohl .

            *grummel* natürlich - so gut kenne ich mich mit den Dingern nicht aus :-)

            Aber dann wäre a@127.0.0.1 nicht möglich...

            ja, ich glaube, ich nehme doch besser die von Sven :-) - mal ganz davon abgesehen, das mir noch niemand untergekommen ist der so eine E-Mail Adresse hat :-)

            Grüße aus Nürnberg
            Tobias

            1. Moin!

              Aber dann wäre a@127.0.0.1 nicht möglich...
              ja, ich glaube, ich nehme doch besser die von Sven :-) - mal ganz davon abgesehen, das mir noch niemand untergekommen ist der so eine E-Mail Adresse hat :-)

              Bedenke: Mein Vorschlag beachtet IP-Adressen (die selbstverständlich gültige Email-Adressen mit-bilden) nicht 100% korrekt. Das liegt schlicht daran, dass am Ende der Domain 2 Zeichen verlangt werden - IP-Adressen hinter dem letzten Punkt aber 1, 2 oder 3 Ziffern stehen haben können.

              Auch wenn es unwahrscheinlich ist, dass jemals solch eine Mailadresse auftritt, sollte man das berücksichtigen.

              "^.+@.+..+$"
              Mindestens ein Zeichen Username, ein @, mindestens ein Zeichen vor dem Punkt, ein Punkt, mindestens ein Zeichen nach dem Punkt.

              - Sven Rautenberg

              --
              "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
          2. Moin!

            Aber dann wäre a@127.0.0.1 nicht möglich...

            Beachtet in diesem Zusammenhang bitte auch, dass IP-Adressen nicht unbedingt in der "dotted decimal notation" geschrieben sein muessen. Man kann sie auch als einfache Zahl (mit hoechstens 32 Bit) schreiben. Z.B. sind 127.0.0.1 und 2130706433 dieselbe Adresse.

            So long

            --
            Bier trinken fetzt!!!
            1. Hallo Calocybe,

              Aber dann wäre a@127.0.0.1 nicht möglich...

              Beachtet in diesem Zusammenhang bitte auch, dass IP-Adressen nicht unbedingt in der "dotted decimal notation" geschrieben sein muessen. Man kann sie auch als einfache Zahl (mit hoechstens 32 Bit) schreiben. Z.B. sind 127.0.0.1 und 2130706433 dieselbe Adresse.

              Windows-Ping kann den Host nicht finden. IE kann mit der Adresse
              nichts anfangen. Mozilla findet das richtige Ergebnis, dafür
              regt sich dann mein Apache auf, die Anfrage sei ein Bad Request.
              Mache ich was falsch, oder ist das normal ...?

              Bye,
              Peter

              --
              Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
  3. Hi Peter,

    jan.schoefer@bc.boehringer-ingelheim.com ist ungültig (laut dem Teil)... feil noch ein bisschen :-)

    Grüße aus Oberschwaben,

    Jan

    Danke schomal

    Bitte, bitte *g*

    1. Hallo Jan,

      jan.schoefer@bc.boehringer-ingelheim.com ist ungültig (laut dem Teil)... feil noch ein bisschen :-)

      Na, meinetwegen, ist korrigiert. Aber lies mal [pref:t=35917&m=196225],
      ganz unten ...

      Bye,
      Peter

      --
      Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
  4. Hallo,

    Hallo Forum,

    es wurde schon hundertmal diskutiert, und jetzt brauche ich es
    selber: Einen regulären Ausdruck, um die syntaktische Korrektheit
    von e-mail-Adressen zu testen.

    Es gibt Leute mit der Meinung, dazu sei ein mehrere Seiten langer
    regulärer Ausdruck nötig - meiner ist 57 Bytes lang. Da ich ihn
    aber für soooo genial halte, möchte ich ihn nicht veröffentlichen,
    sondern darum bitten ihn zu testen:

    http://www.a4a.de/temp/check.php?check=[Adresse]

    Wahrscheinlich haben die Leute mit dem mehrere Seiten langen Ausdruck genügend Hirnschmalz verbraten, um der Meinung sein zu können, der Ausdruck müsse unbedingt so lang sein. ;)

    Siehe : http://www.a4a.de/temp/check.php?check='<>"@de.-.de

    Was valide sein soll, ich aber nicht recht glauben kann (zumindest nicht nach grober Lektüre des Appendix der zitierten RFC).

    Gruß Alex

  5. Hi,

    Es gibt Leute mit der Meinung, dazu sei ein mehrere Seiten langer
    regulärer Ausdruck nötig - meiner ist 57 Bytes lang. Da ich ihn
    aber für soooo genial halte, möchte ich ihn nicht veröffentlichen,
    sondern darum bitten ihn zu testen:

    <mailbox> ::= <local-part> "@" <domain>
    <local-part> ::= <string> | <quoted-string>
    <quoted-string> ::=  """ <qtext> """
    <qtext> ::=  "" <x> | "" <x> <qtext> | <q> | <q> <qtext>
    <q> ::= any one of the 128 ASCII characters except CR, LF, quote ("),
       or backslash ()

    Es darf also kein " nach dem " kommen.

    Dein Teil spuckt aber

    ""mail"@example.org
    is valid

    aus. Es werden also ungültige Adressen durchgelassen.

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    1. Hallo Andreas,

      <mailbox> ::= <local-part> "@" <domain>
      <local-part> ::= <string> | <quoted-string>
      <quoted-string> ::=  """ <qtext> """
      <qtext> ::=  "" <x> | "" <x> <qtext> | <q> | <q> <qtext>
      <q> ::= any one of the 128 ASCII characters except CR, LF, quote ("),
         or backslash ()

      Es darf also kein " nach dem " kommen.

      Dein Teil spuckt aber

      ""mail"@example.org
      is valid

      aus. Es werden also ungültige Adressen durchgelassen.

      Du hast Recht, da habe ich gestern Abend bei einer anderen
      Änderung nochmal was durcheinander gebracht. Ich werde mich da
      mal heute Nachmittag drum kümmern.

      Kannst Du mir auch erklären, ob <s> Punkte wirklich ausschließt,
      oder ob ich das nur falsch verstanden habe ...?

      Bye,
      Peter

      --
      Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
      1. Hi,

        Du hast Recht, da habe ich gestern Abend bei einer anderen
        Änderung nochmal was durcheinander gebracht. Ich werde mich da
        mal heute Nachmittag drum kümmern.

        Kannst Du mir auch erklären, ob <s> Punkte wirklich ausschließt,
        oder ob ich das nur falsch verstanden habe ...?

        Nach RFC 819: ja.

        Wirf mal einen Blick in die RFC 2822, danach wäre es m.E. erlaubt:

        addr-spec       =       local-part "@" domain
        local-part      =       dot-atom / quoted-string / obs-local-part
        dot-atom        =       [CFWS] dot-atom-text [CFWS]
        dot-atom-text   =       1*atext *("." 1*atext)

        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        1. Hallo Andreas,

          Du hast Recht, da habe ich gestern Abend bei einer anderen
          Änderung nochmal was durcheinander gebracht. Ich werde mich da
          mal heute Nachmittag drum kümmern.

          Kannst Du mir auch erklären, ob <s> Punkte wirklich ausschließt,
          oder ob ich das nur falsch verstanden habe ...?

          Nach RFC 819: ja.

          Wirf mal einen Blick in die RFC 2822, danach wäre es m.E. erlaubt:

          addr-spec       =       local-part "@" domain
          local-part      =       dot-atom / quoted-string / obs-local-part
          dot-atom        =       [CFWS] dot-atom-text [CFWS]
          dot-atom-text   =       1*atext *("." 1*atext)

          Hmm..... das ist ja schon wesentlich tiefer. Jetzt weiß ich,
          warum sich schon so viele Leute daran die Zähne ausgebissen
          haben ;-)

          Die Variante mit dot-atom in local-part ist ja kein Problem.
          Schwierig wird's dann IMHO mit quoted-string ...

          Bye,
          Peter

          --
          Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
    1. Moin!

      Hi,
      http://aktuell.de.selfhtml.org/tippstricks/programmiertechnik/email/index.html

      Zu diesem Artikel ist eigentlich nur anzumerken, dass ".museum"-Adressen fälschlich zurückgewiesen werden.

      - Sven Rautenberg

      --
      "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
  6. Holladiewaldfee,

    ...@...de
    is valid

    Wer's glaubt ... ;-)

    Ciao,

    Harry

    --
      Hä? Was? Signatur?! Kann man das essen?
  7. Hallo mal wieder,

    ich habe mal wieder an meinem regulären Ausdruck rumgebaut ...
    der erste war ja wohl doch etwas veraltet, und die Domainprüfung
    ging gar nicht.

    --> http://www.a4a.de/temp/check.php?check=deine.adresse@domain.invalid

    Wer Lust hat, kann ja jetzt nochmal gucken, ob etwas falsches aus-
    gespuckt wird.
    Es sei aber angemerkt, dass quoted-string (also Adressen in Form
    von "Vorname Nachname"@domain.invalid) noch nicht implementiert
    sind, da mir die Beschreibung in der RFC auf den ersten Blick
    etwas undurchsichtig vorkam ;-)

    Bye,
    Peter

    --
    Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.