Vollqualifizierte Überprüfung des Domänennamens
Gibt es eine schnelle und schmutzige Art und Weise zu überprüfen, ob der korrekte FQDN eingetragen wurde? Halten Sie im Verstand dort ist kein DNS-server oder Internet-Verbindung, so dass die Validierung erfolgt über regex/awk/sed.
Irgendwelche Ideen?
InformationsquelleAutor der Frage Riaan | 2012-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist schwieriger jetzt, was mit internationalisierten domain-Namen und mehreren tausend (!) neue TLDs.
Ist der einfache Teil ist, dass Sie immer noch teilen Sie die Komponenten ".".
Müssen Sie eine Liste von TLDs registriert. Es gibt eine Website:
https://publicsuffix.org/list/effective_tld_names.dat
Müssen Sie nur überprüfen, die von der ICANN anerkannt lieben. Beachten Sie, dass eine TLD registriert haben können mehr als eine Komponente, wie beispielsweise "co.uk".
Dann gibt ' s IDN und punycode. Domains sind nun Unicode. Zum Beispiel,
"xn--nnx388a" ist äquivalent zu "臺灣". Beide sind gültige TLDs, übrigens.
Für die punycode-Konvertierung-code, siehe "http://golang.org/src/pkg/net/http/cookiejar/punycode.go".
Überprüfung der syntax von jeder Domäne Komponente hat neue Regeln zu. Sehen RFC5890 an
http://tools.ietf.org/html/rfc5890
Komponenten kann entweder Ein-labels (nur ASCII) oder Unicode.
ASCII-Etiketten entweder nach der alten syntax, oder beginnen Sie mit "xn--", in dem Fall sind Sie ein punycode
version einer Unicode-Zeichenfolge.
Die Regeln für Unicode sind sehr Komplex, und sind in RFC5890. Die Regeln sollen verhindern, dass sich solche Dinge wie das mischen Zeichen von-Links-nach-rechts und rechts-nach-Links-sets.
Sorry, es gibt keine einfache Antwort.
InformationsquelleAutor der Antwort John Nagle
regex ist immer bestenfalls eine Näherung für Dinge wie diese, und die Regeln ändern sich im Laufe der Zeit. die obige regex geschrieben wurde, mit den folgenden im Auge und spezifischen Hostnamen-
Hostnamen sind aus einer Reihe von labels, verkettet mit Punkten.
Jedes label ist 1 bis 63 Zeichen lang sein, und kann enthalten:
Zusätzlich:
(http://blogs.msdn.com/b/oldnewthing/archive/2012/04/12/10292868.aspx)
einige Annahmen:
Ergebnisse: gültige /ungültige
BEARBEITEN:
John Rix, sofern eine alternative hack der regex, um die Spezifikation einer TLD optional:
EDIT 2:
jemand fragte nach einer version, die funktioniert in js.
der Grund, es funktioniert nicht mit js, weil js nicht unterstützt regex Blick hinter.
speziell der code
(?<!-)
- gibt an, dass die vorherigen Zeichen nicht ein Bindestrich.sowieso, hier ist es umgeschrieben ohne lookbehind - ein wenig hässlicher, aber nicht viel
könnte man ebenfalls eine ähnliche Ersatz auf John Rix version.
EDIT 3: wenn Sie zulassen möchten, dass nachfolgende Punkte - was ist technisch erlaubt:
Ich war nicht vertraut mit Punkt-syntax till @ChaimKut wies Sie aus, und ich habe einige der Forschung
Über nachfolgende Punkte jedoch zu verursachen scheint etwas unberechenbar Ergebnisse in den verschiedenen tools, die ich so gespielt wäre ich raten, einige Vorsicht.
InformationsquelleAutor der Antwort bkr
Dieser regex ist, was Sie wollen:
Passen deine Beispiel-domain (groupa-zone1appserver.example.com oder cod.eu etc...)
Ich werde versuchen zu erklären:
(?=^.{1,254}$)
Spiele domain-Namen (beginnen kann mit jedem char), die zwischen 1 und 254 char, es könnte auch 5,254 wenn wir annehmen, dass co.Großbritannien ist die minimale Länge.(^
ab match(?:
definieren Sie eine dazu passende Gruppe(?!\d+\.)
der domain-name sollte nicht erfasst werden, zahlen, so ist 1234.co.uk oder abc.123.Großbritannien nicht akzeptiert wird, während 1a.ko.Großbritannien ja.[a-zA-Z0-9_\-]
domain-Namen zusammengesetzt sein sollte, indem Sie Wörter mit nur a-zA-Z0-9_-{1,63}
die Länge der domain-Ebene ist maximal 63 char (es könnte sein 2,63)+
und(?:[a-zA-Z]{2,})$)
den letzten Teil der domain-name sollte nicht sein, gefolgt von einer beliebigen anderen Wort-und muss aus einem Wort mit mindestens 2 char a-zA-ZInformationsquelleAutor der Antwort tombolinux
ÜBERLEGUNG #1:
Bitte beachten Sie, dass aufgrund der entspannten Anforderungen in RFC 2181 DNS-Etiketten können darin bestehen, dass so ziemlich jede Kombination von Symbolen (allerdings werden die Längenbeschränkungen sind immer noch da):
"Jedem binären string, was auch immer verwendet werden kann, wie das Etikett von jeder resource-record. Implementierung der DNS-Protokolle müssen nicht irgendwelche Einschränkungen auf den Etiketten, die verwendet werden können. Insbesondere die DNS-Server müssen sich nicht weigern, zu dienen, eine zone, weil es enthält Bezeichnungen, die möglicherweise nicht akzeptabel sein, einige DNS-client-Programme." (https://tools.ietf.org/html/rfc2181#section-11)
ÜBERLEGUNG #2:
"Es gibt eine weitere Regel, die im wesentlichen verlangt, dass top-level-domain-Namen, die nicht-numerische" (https://tools.ietf.org/html/rfc3696#section-2)
Unter Berücksichtigung dieser beiden Betrachtungen, die richtige regex sieht wie folgt aus:
/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i
Siehe demo @ http://regexr.com/3g5j0
InformationsquelleAutor der Antwort Anton Nikiforov
Den folgenden Ausdruck
entsprechen
aber nicht überein:
InformationsquelleAutor der Antwort Jason Bruce