Sancho: Adress-Syntax

Hallo,

Ich hätte da mal ein paar Fragen:

1. Wenn ich die RFC 2396 richtig gelesen habe, läßt sie 1-Zeichen-Label bei Domainnamen zu. (Die Definition schließt sie jedenfalls nicht aus.) Und das gilt - andere Einschränkungen mal beiseite gelassen - auch für die Top-Label.

Frage: Gibt es Top-Label, die aus nur einem Buchstaben bestehen?

Und falls es sie aus irgendeinem Grund nicht geben _darf_ - wo ist das festgelegt?

2. Der display-name bei E-Mail-Adressangaben, in folgendem Beispiel also die Zeichenfolge 'Franz Zobel':

Franz Zobel frazbl@irgendein.museum

  • diese Zeichenfolge also unterliegt, was die Zeichen, die sie enthalten darf, laut RFC 822/2822 den gleichen Einschränkungen wie der local-part (die Zeichenfolge 'frazbl'). D.h. also unter anderem: Umlaute nur escaped und innerhalb eines quoted-string.

Frage: Sind da schon IDNA-ähnliche UTF-8-Konvertierungsregeln in Aussicht oder geplant?

(Zumindest im display-name wäre es doch sinnvoll, damit z.B. Frau Dörte Flügel sich auch als erwachsene Person nicht immer noch als

Doerte Fluegel dfl@irgendein.museum  oder  "D\örte Fl\ügel" dfl@irgendein.museum

anschreiben lassen muss (denn als Kind ist sie schließlich genug gehänselt worden wegen ihres Namens, unterstelle ich mal, auch wenn ich sie jetzt gerade eben erst erfunden hab.)

Zumindest das inzwischen ja mögliche

"D\örte Fl\ügel" <dfl@Dörte.Flügel.org>

ist irgendwie - mir fällt kein besserer Ausdruck ein - ist irgendwie: daneben, finde ich.

Kennt da jemand den neuesten Stand der Dinge?

Grüße,

Sancho

  1. Nochmal Hallo,

    vielleicht habe ich mich in meinem Posting gestern etwas unverständlich ausgedrückt.

    Ich wollte eigenlich nur wissen ob mir jemand sagen kann, wo eigentlich festgelegt ist, dass Top-Level-Domains aus _mindestens_ 2 Zeichen bestehen müssen, da ich diese Einschränkung (wenn sie auch z.B. in nahezu _allen_ konstruierten regexen zu dem Thema auftaucht) zumindest in der RFC 2396 nicht gefunden habe. Denn dort steht (Zitat Seite 12):

    hostname      = *( domainlabel "." ) toplabel [ "." ]
          domainlabel   = alphanum | alphanum *( alphanum | "-" ) alphanum
          toplabel      = alpha | alpha *( alphanum | "-" ) alphanum

    alpha | alpha *( alphanum | "-" ) alphanum

    interpretiere ich als:

    entweder:  [a-zA-Z]{1}

    oder:      [a-zA-Z]+[a-zA-Z0-9-]*[a-zA-Z0-9]+

    Mithin wäre also folgende Domain RFC-gemäß:

    www.a2-0.c

    Auf das letzte, einzeln für sich stehende 'c' in dem Beispiel zielte meine Frage. Archiv-, Google- und sonstige Suchen ergaben immer nur Ergebnisse zum Thema der maximalen, nicht aber der _minimalen_ Länge von TLDs - bzw. wenn eine Minimalzahl angegeben wurde, dann fand ich keinen exakten Hinweis auf die Quelle oder Regel, die der Angabe zugrundeliegt.

    Wo also ist festgelegt, dass Top-Level_Domains mindestens 2 Zeichen haben müssen? In der maßgeblichen RFC ja offenbar nicht.

    Eine offensichtlich selten gestellt Frage. Oder habe ich etwas übersehen? Die RFC habe ich doch richtig gelesen? Kann mir da jemand helfen?

    ===

    Die zweite Frage bezog sich auf ebenfalls schwer zu findende Informationen über den Diskussionsstand im Hinblick auf künftig verwendbare Zeichen im Display-Namen einer E-Mail Adresse. Wenn dank Punycode clientseitige Konvertierungsmechanismen von UTF8 in den Domainnamen-Zeichenvorat sich bewähren, wird man doch wohl davon ausgehen können, dass entsprechende Konvertierungsregeln zumindest für diesen Displaynamen nur eine Frage der Zeit sind.
    D.h. dass man also die von mir zitierte Adresse dann auch in der Form

    Dörte Flügel <dfl@dörte.flügel.org>

    schreiben kann.

    [Das ist wirklich bitte nur ein Beispielname wegen der Umlaute zu verstehen.]

    Hat da niemand irgendwas gehört oder gelesen? Würde mich einfach interessieren, was Ihr Quell-nahen Leute darüber wißt.

    Grüße,

    Sancho

    1. Hallo,

      ...scheint ja ein echter 'Self'->HTMT<  (T für Thread) zu bleiben.

      Hier nur nochmal, was die Wikipedia zu Labeln in Domainnamen schreibt:

      "Der Domänennamensraum hat eine baumförmige Struktur. Die Blätter und Knoten des Baumes werden als Labels bezeichnet. Ein kompletter Domänenname eines Objektes besteht aus der Verkettung aller Labels. Label sind Zeichenketten (alphanumerisch, als einziges Sonderzeichen ist '-' erlaubt), die MINDESTENS 1 ZEICHEN und maximal 63 Zeichen lang sind."

      (Zitat Ende, Hervorhebung von mir, im Artikel folgt keine Einschränkung dieser Regel für TLDs)

      Ich glaube, Wikipedia und RFC zusammen können wohl als maßgeblich betrachtet werden.

      Also, vielleicht sollte man - nur 'for the record' - einfach mal klipp und klar darauf hinweisen, dass fast alle umhergeisternden regexe für Domainnamen schon beim obersten (Top-)Level nicht nur im Hinblick auf die Maximalzahl, sondern eben auch im Hinblick auf die _Minimalzahl_ der Zeichen schlichtweg falsch sind (All diese {2,4} {2,6}, {2,} etc.)

      Folgender TLD-regex wäre, wenn er denn not tut, wohl korrekt:

      $topLabel = '(?:[a-zA-Z]+|[a-zA-Z]+[a-zA-Z\d-]{0,61}[a-zA-Z\d]+)';

      Denn sonst ist wohl mit folgendem zu rechnen (passend zu Ostern):

      "Es erben sich Gesetz und Rechte
      Wie einige ewge Krankheit fort,
      Sie schleppen von Geschlecht sich zum Geschlechte
      Und rücken sacht von Ort zu Ort.
      Vernunft wird Unsinn, Wohltat Plage:
      Weh Dir, daß Du ein Enkel bist!
      Vom Rechte, das mit uns geboren ist
      Von dem ist leider nie die Frage."

      (Wobei 'Gesetz und Rechte' für 'reguläre Ausdrücke' und 'erben' für 'copy and paste' stehen könnte.)

      Herzhaft grüßt, im Sinne der Omas und Opas, Enkelinnens und Enkels

      Sancho

      1. Hallo,

        Also, vielleicht sollte man - nur 'for the record' - einfach mal klipp und klar darauf hinweisen, dass fast alle umhergeisternden regexe für Domainnamen ... schlichtweg falsch sind

        Das ist hier bekannt ;-)) http://forum.de.selfhtml.org/archiv/2004/5/t81617/#m474888.

        Zum Anderen, den Umlauten in E-Mail-Adressen, werde ich nichts sagen, weil ich es bisher unsinnig finde und es mich deshalb nicht interessiert. Der ganze Hype um die Umlaut-Domains (IDN) war ja auch nur heiße Luft. Solange man Browser-Hersteller nicht zur Einhaltung von Standards verpflichten kann bzw. sich Standardkonforme Browser nicht durchsetzen, werden solche Neuerungen immer nur verpuffen. Bei E-Mail-Clients ist die Hersteller-Bandbreite ja noch größer.

        viele Grüße

        Axel

        1. Hallo,

          http://forum.de.selfhtml.org/archiv/2004/5/t81617/#m474888.
          oOops, der Link vom Archiv 2004 ins Archiv 2000 funktioniert nicht mehr.
          Hier ist Cheatahs URL-regex http://forum.de.selfhtml.org/archiv/2000/9/t21614/#m110363

          viele Grüße

          Axel

          1. Hallo Axel,

            ich danke Dir für den Hinweis. Dass Dein erster Link ins Leere führte mag mich dafür entschuldigen, dass ich die Archivseite, auf die der zweite verwies per Archivsuche nicht gefunden habe.

            Allerdings:

            my $toplabel  =  "(?:(?:$alpha(?:$alphadigit-)*$alphadigit)$alpha)";

            müsste in dieser Form doch wohl lauten:

            my $toplabel  =  "(?:(?:$alpha(?:$alphadigit-)*$alphadigit)*$alpha)";

            Oder? (Beachte den zusätzlichen Stern hinter der zweiten schließenden Klammer.)

            Da sonst ja die einstelligen TLDs schon wieder ausgeschlossen sind.

            (Ob es die nun gibt, oder nicht, ist bei einer RFC-orientierten regex ja egal; es geht ja nur um das, was es gemäß Regel geben kann und was nicht.)

            Grüße,

            Sancho

            1. Halt!!

              Allerdings:

              my $toplabel  =  "(?:(?:$alpha(?:$alphadigit-)*$alphadigit)$alpha)";

              müsste in dieser Form doch wohl lauten:

              my $toplabel  =  "(?:(?:$alpha(?:$alphadigit-)*$alphadigit)*$alpha)";

              Oder? (Beachte den zusätzlichen Stern hinter der zweiten schließenden Klammer.)

              Falsch! Sofort zurück!
              Die Korrktur ist auch nicht richtig.
              (Aber Cheatahs Vorgabe trotzdem auch nicht.)

              Es bleibt bei dem, was ich oben schrieb:

              [my] $topLabel = '(?:[a-zA-Z]+|[a-zA-Z]+[a-zA-Z\d-]{0,61}[a-zA-Z\d]+)';

              *Schwitz*

              und Ostergruß,

              Sancho.

              1. ...nochwas:

                In Chaetahs Variablen-Terminologie scheint zudem noch einiges falsch zu sein, schon gleich am Anfang:

                my $lowalpha       =  '(?:[a-z])';
                my $hialpha        =  '(?:[A-Z])';
                my $alpha          =  "(?:$lowalpha$hialpha)";

                $alpha in ausgeschriebener Form wäre dann:

                (?:(?:[a-z])(?:[A-Z]))

                zu deutsch: ein kleiner Buchstabe a-z gefolgt von einem großen Buchstaben A-Z.

                Der Term alpha bezeichnet aber einfach nur _einen_ Buchstaben aus der Menge [a-zA-Z].

                Die Klammerung bei den Einzeldefinitionen ist nicht nur überflüssig sondern falsch.

                Fragezeichen gefolgt von Kolon am Anfang einer Parenthese kenzeichnet nicht eine Alternative, sondern bewirkt nur, dass der Ausdruck innerhalb der Parenthese zwar gruppiert, aber nicht in der Ergebnissequenz gespeicht wird.
                (Aber das müßte Cheatah, dessen Forumsbeiträge im Übrigen einer der Gründe sind, warum ich hier oft, wenn auch nur als 'Zaungast', zu Besuch bin, doch eigentlich wissen?)

                Also, liebe Grüße,

                insbesondere auch an Cheatah,

                Sancho

                1. Hallo,

                  $alpha in ausgeschriebener Form wäre dann:
                  (?:(?:[a-z])(?:[A-Z]))
                  zu deutsch: ein kleiner Buchstabe a-z gefolgt von einem großen Buchstaben A-Z.
                  Der Term alpha bezeichnet aber einfach nur _einen_ Buchstaben aus der Menge [a-zA-Z].

                  Ja, jetzt wo Du es sagst, sehe ich es auch ;-)). Ehrlich gesagt hatte ich mir das Ding nie genau angesehen, sondern immer als unpraktikabel verworfen und deshalb nie versucht, URLs mit RegExp zu prüfen, sondern nur in Sprachen (Java), die hierfür Klassen anbieten. Eventuell übersehen wir beide aber auch etwas? Naja, Cheatah liest und postet ja hier heute immer noch mit.

                  Hier http://forum.de.selfhtml.org/archiv/2002/10/t26766/#m145935 ist übrigens noch so ein Ungetüm im Gespräch.

                  viele Grüße

                  Axel

                  1. Hallo Axel,

                    Hier http://forum.de.selfhtml.org/archiv/2002/10/t26766/#m145935 ist übrigens noch so ein Ungetüm im Gespräch.

                    Danke für den neuen Hinweis - ich war in den PerlFaq9 schon mal über einen Link auf ein ähnliches 'Ungetüm' gestolpert:

                    http://www.cpan.org/authors/Tom_Christiansen/scripts/ckaddr.gz

                    (Der Regex ist unten anghängt.) Es war mir aber damals (und ist es heute immer noch) in der so geschriebenen Form zu sehr ein - Ungetüm eben, um es genauer zu analysieren.

                    Ich habe jetzt mal aus dem Regex, auf den Dein Link verweist, den Teil, der den Top-Level repräsentiert, isoliert:

                    (...)

                    a-zA-Z?

                    (...)

                    Das scheint es korrekt zu treffen; ist auch noch eleganter als mein Vorschlag, weil es eine bei mir noch vorhandene unötige Erwähnung von [a-zA-Z] ausspart.

                    (Ich hatte halt noch nahe an der RFC 'übersetzt':)

                    toplabel = alpha | alpha *( alphanum | "-" ) alphanum

                    Das einzige, was ich da noch zu 'bemäkeln' hätte, ist der fehlende optionale Endpunkt (dahinter 'steht' ja bekanntlich die 'root' aller Domains, reräsentiert durch einen leeren String). Dass das gängige Weglassen dieses Punktes eine - akzeptable, aber trotzdem: - Auslassung ist, könnte man in dem Regex ja noch zusätzlich repräsentieren; dann 'matcht' der Ausdruck auch die korrekte Angabe von beispielsweise

                    www.example.com.

                    Ist ja auch leicht als Option anhängbar:

                    a-zA-Z?.?

                    Jetzt fehlt allenfalls noch die numerische Einschränkung.
                    _Wenn_ die Begrenzung auf 63 Zeichen pro Label einbezogen werden soll, könnte man wohl noch folgendermaßen abwandeln:

                    a-zA-Z\d?).?

                    Das müßte jetzt eigentlich eine wirklich brauchbare (TLD-)Lösung sein, denke ich.

                    Was meinst Du?

                    Herzlich,

                    Sancho

                    1. Hallo nochmal,

                      Reguläre Ausdrücke brauchen Zeit (oder viele Augen) zum Reifen!

                      Hier erst mal eine (hoffentlich letzte) Flüchtigkeits-Korrektur:

                      a-zA-Z\d?).?

                      ^^                                       ^

                      Irgendwie hat sich in den letzten Regex ein '\d' zuviel hineingschlichen (Sorry!); das muss natürlich noch weg; außerdem ist da am Ende auch noch eine schließende Klammer zuviel; richtig wäre gewesen:

                      a-zA-Z?.?

                      Und genau genommen sind auch dann immer noch überflüssige Kompliziertheiten enthalten. Also - mein letzter Stand ist jetzt:

                      a-zA-Z?.?

                      (Ist auch viel leichter zu lesen.)

                      Findet jetzt jemand noch einen Fehler?

                      Wenn ja, wäre ich für ein Mit-der-Nase-darauf-gestoßen-werden wirklich dankbar.

                      Gruß,

                      Sancho

                      1. *räusper*

                        ...auch empfiehlt es sich bei regulären Ausdrücken, sie über Nacht stehen lassen und am nächsten Tag nochmal anzuschauen.

                        Also, Frage: Was ist hier noch nonsense?

                        a-zA-Z?.?

                        Richtig: Die halbherzigen Quantifizierungen. Die Idee mit dem 0-61 ist gut; aber in der Ausführung wurde g'schlampert.
                        Wenn dadurch auf insgesamt maximal 63 Zeichen (abgesehen von dem optionalen Endpunkt) quantifiziert werden soll, dann wohl eher so:

                        [a-zA-Z]{1}(?:[a-zA-Z\d-]{0,61}[a-zA-Z\d]{1})?.?

                        Und _jetzt_ lächelt die RFC-2396-Fee:

                        Genau ein <alpha> am Anfang (um Domainnamen durch den Toplabel von IPv4 unterscheiden zu können);

                        im Anschluß entweder: nichts (die Gruppe insgesamt kann wegfallen)

                        oder: eine einzelne Gruppe mit
                                              entweder: nichts (Anzahl Zeichen der Klasse [<alphanum> oder '-'] ist 0)
                                                  oder: maximal 61 Zeichen dieser Klasse,
                                              gefolgt von (oder einzeln für sich) exakt 1 <alphanum>;

                        das Ganze also mindestens 1 und maximal 63 Zeichen lang;

                        und abgeschlossen von einem oder keinem Punkt.

                        (Falls die bevozugte Proportionalschrift für Verwirrung sorgen sollte: einmal kurz auf Courier umschalten.)

                        Das wärs.

                        Grüße,

                        Sancho

                    2. Hallo,

                      Ich habe jetzt mal aus dem Regex, auf den Dein Link verweist, den Teil, der den Top-Level repräsentiert, isoliert:

                      *g* Ja, wie gesagt, ich hatte bisher das Glück, bei soetwas nie auf die unperformanten RegExp angewiesen zu sein (Bist Du sicher, dass man das nicht, je nach Programmiersprache, mit Klassen bzw. Subroutinen oder Funktionen besser lösen kann?). Meine Lösung waren/(konnten sein) bisher immer die Klassen aus java.net.

                      viele Grüße

                      Axel

                      1. Hi Axel,

                        (Sorry, hatte Dein Posting ganz übersehen; ich hatte schon gedacht, dass keiner mahr antworten mag.)

                        *g* Ja, wie gesagt, ich hatte bisher das Glück, bei soetwas nie auf die unperformanten RegExp angewiesen zu sein (Bist Du sicher, dass man das nicht, je nach Programmiersprache, mit Klassen bzw. Subroutinen oder Funktionen besser lösen kann?). Meine Lösung waren/(konnten sein) bisher immer die Klassen aus java.net.

                        Stimmt schon, der Engine muss halt angeschmissen werden. Andererseits: Klassen müssen auch erstmal geladen werden (Bei Java kenn ich mich allerdings nicht so aus; die Leute da sind, was die Einbindung von vorkompilierten Codes betrifft, natürlich Spezialisten.)

                        Bei PHP kann man sich, wenn das Ganze möglichst plattformübergreifend sein soll, jedenfalls nicht darauf verlassen, dass die entsprechenden PEAR-Klassen auf dem Server auch vorhanden sind...

                        Aber die Performance von Regexen hängt meinen Erfahrungen sehr von ihrer Bauart ab. Bei komplizierteren zu prüfenden Inhalten (und eine E-Mail-Adresse beispielsweise _ist_ kompliziert, das sie eine Menge Informationen auf sehr engem Raum enthält) brauch man, wenn mans stattdessen über Funktionen löst, ja auch eine gewisse Anzahl an Subroutinen, die dann ja auch alle erstmal geladen werden müssen.

                        Ich hab bei einer anderen Gelegenheit auch schon mal Performance-Vergleiche zwischen einer Regex und einer funktionalen Lösung mit entsprechenden PHP-String-Funktionen gemacht. Wenn man da z.B. strspn und strcspn verwendet, dann ist die Regex unter Umständen sogar noch schneller ;-)

                        Herzliche Grüße,

                        Hendrik