Ich muss einen Domainnamen validieren:
google.com
stackoverflow.com
Also eine Domain in ihrer rauesten Form - nicht einmal eine Subdomain wie www.
- Zeichen sollten nur az | sein AZ | 0-9 und Punkt (.) Und Bindestrich (-)
- Der Domainnamen-Teil sollte nicht mit einem Bindestrich (-) beginnen oder enden (z. B. -google-.com).
- Der Domainnamen-Teil sollte zwischen 1 und 63 Zeichen lang sein
Die Erweiterung (TLD) kann vorerst alles sein, was unter den Regeln Nr. 1 steht. Ich kann sie später anhand einer Liste validieren. Es sollten jedoch 1 oder mehr Zeichen sein
Bearbeiten: TLD ist anscheinend 2-6 Zeichen wie es ist
Nein. 4 überarbeitet: TLD sollte eigentlich als "Subdomain" bezeichnet werden, da es Dinge wie .co.uk enthalten sollte - ich würde mir vorstellen, dass die einzig mögliche Validierung (abgesehen von der Überprüfung anhand einer Liste) "nach dem ersten Punkt sollte es einen oder" geben mehr Zeichen unter Regeln # 1
Vielen Dank, glauben Sie mir, ich habe es versucht!
regex
validation
domain-name
Dominic
quelle
quelle
Antworten:
Nun, es ist
ziemlich einfach,etwas hinterhältiger als es aussieht (siehe Kommentare), angesichts Ihrer spezifischen Anforderungen:Beachten Sie jedoch, dass dadurch viele gültige Domains abgelehnt werden.
quelle
g.co
ist ein gültiger Domainname, aberg
nur ein Zeichen./^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/
. Aber dies lehnt immer noch Tonnen von gültigen Sachen ab ...Ich weiß, dass dies ein alter Beitrag ist, aber allen regulären Ausdrücken hier fehlt eine sehr wichtige Komponente: die Unterstützung für IDN-Domainnamen.
IDN-Domainnamen beginnen mit xn--. Sie aktivieren erweiterte UTF-8-Zeichen in Domänennamen. Wussten Sie beispielsweise, dass "♡ .com" ein gültiger Domainname ist? Ja, "love heart dot com"! Um den Domainnamen zu validieren, müssen Sie http://xn--c6h.com/ die Validierung bestehen lassen.
Beachten Sie, dass Sie zur Verwendung dieses regulären Ausdrucks die Domäne in Kleinbuchstaben konvertieren und eine IDN-Bibliothek verwenden müssen, um sicherzustellen, dass Sie Domänennamen in ACE codieren (auch als "ASCII-kompatible Codierung" bezeichnet). Eine gute Bibliothek ist GNU-Libidn.
idn (1) ist die Befehlszeilenschnittstelle zur internationalisierten Domänennamenbibliothek. Im folgenden Beispiel wird der Hostname in UTF-8 in ACE-Codierung konvertiert. Die resultierende URL https: //nic.xn--flw351e/ kann dann als ACE-codiertes Äquivalent von https: // nic. 谷 歌 / verwendet werden .
Dieser magische reguläre Ausdruck sollte die meisten Domänen abdecken (obwohl ich sicher bin, dass es viele gültige Randfälle gibt, die ich übersehen habe):
Wenn Sie einen regulären Ausdruck für die Domänenvalidierung auswählen, sollten Sie prüfen, ob die Domäne den folgenden Kriterien entspricht:
Wenn diese drei Domains nicht bestanden werden, erlaubt Ihr regulärer Ausdruck möglicherweise keine legitimen Domains!
Weitere Informationen finden Sie auf der Seite zur Unterstützung internationalisierter Domänennamen im Oracle International Language Environment Guide für weitere Informationen.
Probieren Sie den regulären Ausdruck hier aus: http://www.regexr.com/3abjr
ICANN führt eine Liste der delegierten tlds, anhand derer einige Beispiele für IDN-Domänen angezeigt werden können.
Bearbeiten:
Dieser reguläre Ausdruck verhindert, dass Domänen mit '-' am Ende eines Hostnamens als gültig markiert werden. Darüber hinaus sind unbegrenzte Subdomains zulässig.
quelle
/^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{1,30})\.?[a-z]{2,})$/i
to.
( to. )to.
kein vollständig qualifizierter Domainname. Wenn Sie Top-Level-Domains zulassen möchten, sollten Sie so etwas wie verwenden^(((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.)?(x--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})\.?$
, aber seien Sie gewarnt, Sie lassen Leute durch, die Domains wietest
oderna
auch einfügen!invali.d
als gültigen Domainnamen, solangeinvali.d.co.uk
es ungültig ist.xn--stackoverflow.com
kein gültiger Name ist, da 'Stackoverflow' nicht aus Punycode konvertiert werden kann. Das geht jedoch über das hinaus, was ein Regex kann. Als allgemeine Bemerkungxn--[a-z0-9]+
würden Beschriftungen nur IDN sein, während siexn--[a-z0-9]+\-[a-z0-9]+
eine Mischung aus ASCII- und Nicht-ASCII-Zeichen anzeigenMein RegEx ist der nächste:
^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$
Es ist in Ordnung für i.oh1.me und für wow.british-library.uk
UPD
Hier ist die Regel aktualisiert
https://www.debuggex.com/r/y4Xe_hDVO11bv1DV
Jetzt wird nach
-
oder_
am Anfang oder Ende des Domain-Labels gesucht.quelle
{2,6}
Kriterien müssen für die neue TLD aktualisiert werden. Wahrscheinlich{2,}
.Meine Wette:
Erklärt:
Der Domänenname wird aus Segmenten erstellt. Hier ist ein Segment (außer final):
Es kann 1-63 Zeichen haben und beginnt oder endet nicht mit '-'.
Fügen Sie jetzt '.' dazu und mindestens einmal wiederholen:
Fügen Sie dann das letzte Segment hinzu, das 2-63 Zeichen lang ist:
Testen Sie es hier: http://regexr.com/3au3g
quelle
Nur eine kleine Korrektur - der letzte Teil sollte bis zu 6 sein.
Die längste TLD ist
museum
(6 Zeichen) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domainsquelle
.photography
available
tlds zu stützen, ist nicht zukunftssicher.{2,63}
: siehe stackoverflow.com/questions/9238640/…Akzeptierte Antwort funktioniert bei mir nicht, versuchen Sie Folgendes:
Besuchen Sie diese Unit Test Cases zur Validierung.
quelle
{2,6}
in etwas anderes und es wird funktionieren. Meins:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Diese Antwort bezieht sich auf Domainnamen (einschließlich Service-RRs) und nicht auf Hostnamen (wie einen E-Mail-Hostnamen).
Es ist im Grunde die Antwort von mkyong und zusätzlich:
Nach Teilen
Lookahead, begrenzen Sie die maximale Länge zwischen ^ $ und 253 Zeichen mit dem optionalen nachgestellten Literal '.'
Lookahead, das nächste Zeichen ist kein '-' und kein '_' folgt einem Zeichen vor dem nächsten '.'. Das heißt, erzwingen Sie, dass das erste Zeichen eines Labels kein '-' ist und nur das erste Zeichen ein '_' sein darf.
Zwischen 1 und 63 der zulässigen Zeichen pro Etikett.
Lookbehind, vorheriges Zeichen nicht '-'. Das heißt, erzwingen Sie, dass das letzte Zeichen eines Labels kein '-' ist.
Erzwinge ein '.' am Ende jedes Etiketts mit Ausnahme des letzten, wo es optional ist.
Meistens von oben kombiniert, erfordert dies mindestens zwei Domänenebenen, was nicht ganz richtig ist, aber normalerweise eine vernünftige Annahme. Wechseln Sie von {2,} zu +, wenn Sie TLDs oder nicht qualifizierte relative Subdomänen zulassen möchten (z. B. localhost, myrouter, to.).
Unit-Tests für diesen Ausdruck.
quelle
Vielen Dank, dass Sie in anderen Antworten die richtige Richtung für Lösungen zur Validierung von Domainnamen angegeben haben. Domain-Namen können auf verschiedene Arten validiert werden.
Wenn Sie die IDN- Domäne in ihrer für Menschen lesbaren Form validieren müssen,
\p{L}
hilft Regex . Dies ermöglicht es, jedem Zeichen in jeder Sprache zu entsprechen.Beachten Sie, dass der letzte Teil möglicherweise auch Bindestriche enthält ! Als Punycode-codierte chinesische Namen können Unicode-Zeichen in tld enthalten sein.
Ich bin zu einer Lösung gekommen, die zum Beispiel passt:
Regex ist:
Überprüfen und stimmen Sie hier ab
HINWEIS: Dieser reguläre Ausdruck ist sehr zulässig, ebenso wie der Zeichensatz für aktuelle Domänennamen.
UPDATE : Noch einfacher,
a-aA-Z\p{L}
genau wie gerade\p{L}
HINWEIS 2: Das einzige Problem besteht darin, dass Domänen mit doppelten Punkten übereinstimmen
masełk..owski.pl
. Wenn jemand weiß, wie man das behebt, bitte verbessern.quelle
[:alpha:]
und[:digit]
statt verwenden\p{L}
. Es funktioniert gut.中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国
überprüft, ob er gültig ist, aber nach der IDN-Konvertierung sind es zu viele Bytes pro Label. \ p {L} stimmt mit Symbolen überein, nicht mit Punycode-Bytes (die von Symbol zu Symbol variieren). Daher ist die Anzahl der Wiederholungen nicht hilfreich, wenn Sie versuchen, die Größe nach der Konvertierung zu begrenzen.[Domain - Kleinbuchstaben und nur 0-9] [kann einen Bindestrich haben] + [TLD - nur Kleinbuchstaben, muss zwischen 2 und 7 Buchstaben lang sein]
http://rubular.com/ ist hervorragend zum Testen regulärer Ausdrücke geeignet !
Bearbeiten: TLD wurde auf maximal 7 Zeichen für '.rentals' aktualisiert, wie Dan Caddigan betonte.
quelle
.photography
wäre ungültig. Machen Sie es einfach unbegrenzt Zeichen oder so etwas.Noch nicht genug Repräsentanten, um einen Kommentar abzugeben. Als Reaktion auf Pakas Lösung stellte ich fest, dass ich drei Elemente anpassen musste:
Vor:
Nach dem:
quelle
Wie bereits erwähnt, ist es nicht offensichtlich, Subdomains im praktischen Sinne zu erzählen (z
.co.uk
. B. Domains). Wir verwenden diesen regulären Ausdruck, um Domänen zu validieren, die in freier Wildbahn vorkommen. Es deckt alle mir bekannten praktischen Anwendungsfälle ab. Neue sind willkommen. Gemäß unseren Richtlinien werden nicht erfassende Gruppen und gierige Übereinstimmungen vermieden.^(?!.*?_.*?)(?!(?:[\d\w]+?\.)?\-[\w\d\.\-]*?)(?![\w\d]+?\-\.(?:[\d\w\.\-]+?))(?=[\w\d])(?=[\w\d\.\-]*?\.+[\w\d\.\-]*?)(?![\w\d\.\-]{254})(?!(?:\.?[\w\d\-\.]*?[\w\d\-]{64,}\.)+?)[\w\d\.\-]+?(?<![\w\d\-\.]*?\.[\d]+?)(?<=[\w\d\-]{2,})(?<![\w\d\-]{25})$
Beweis, Erklärung und Beispiele: https://regex101.com/r/FLA9Bv/9 ( Hinweis: Funktioniert derzeit nur in Chrome, da der Regex Lookbehinds verwendet, die nur in ECMA2018 unterstützt werden )
Bei der Validierung von Domains stehen zwei Ansätze zur Auswahl.
By-the-Books-FQDN-Matching (theoretische Definition, in der Praxis selten anzutreffen):
Praktischer / konservativer FQDN-Abgleich (praktische Definition, in der Praxis erwartet und unterstützt):
[a-zA-Z0-9.-]
quelle
quelle
Hier ist der vollständige Code mit Beispiel:
quelle
Für neue gTLDs
quelle
Vielen Dank an @mkyong für die Grundlage für meine Antwort. Ich habe es geändert, um längere akzeptable Etiketten zu unterstützen.
Außerdem ist "localhost" technisch gesehen ein gültiger Domainname. Ich werde diese Antwort ändern, um internationalisierten Domainnamen Rechnung zu tragen.
quelle
([a-zA-Z]{1,2})
-> um nur zwei Zeichen zu akzeptieren.([0-9]{1,2})
-> nur zum Akzeptieren von zwei NummernWenn etwas mehr als zwei überschreitet, wird
([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])
dieser reguläre Ausdruck dafür sorgen.Wenn wir das Matching mindestens einmal durchführen wollen,
+
wird es verwendet.quelle
Beispiele, die funktionieren:
Es funktioniert auch für Erweiterungen
Beispiele, die nicht funktionieren:
Es funktioniert auch mit der längsten Domain-Endung
".versicherung"
quelle
^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{0,30})\.[a-z-1-9]{2,})$
überprüft solche Domänen wie
яндекс.рф
nach der Codierung.https://regex101.com/r/Hf8wFM/1 - Sandbox
quelle
Der folgende reguläre Ausdruck extrahiert das Sub, root und tld einer bestimmten Domain:
Getestet für folgende Domains:
quelle
Ich habe das Folgende getan, um die Domain zusammen mit dem Protokoll einfach abzurufen. Beispiel: https://www.facebook.com/profile/user/ ftp://182.282.34.337/movies/M
Verwenden Sie das folgende Regex-Muster: [a-zA-Z0-9] +: //.*? /
Sie erhalten die Ausgabe: https://www.facebook.com/ ftp://192.282.34.337/
quelle