Was ist ein regulärer Ausdruck, der mit einem gültigen Domainnamen ohne Subdomain übereinstimmt?


121

Ich muss einen Domainnamen validieren:

google.com

stackoverflow.com

Also eine Domain in ihrer rauesten Form - nicht einmal eine Subdomain wie www.

  1. Zeichen sollten nur az | sein AZ | 0-9 und Punkt (.) Und Bindestrich (-)
  2. Der Domainnamen-Teil sollte nicht mit einem Bindestrich (-) beginnen oder enden (z. B. -google-.com).
  3. Der Domainnamen-Teil sollte zwischen 1 und 63 Zeichen lang sein
  4. 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!


1
Kann überhaupt nicht hilfreich sein. Wenn es um google.de und einige japanische Domains geht, müssen Sie sicher zweimal überlegen, bevor Sie Regex dafür verwenden. Mein persönlicher Gedanke ist, dass Regex nicht ausreicht, um eine Domain zu einer realen Domain zu validieren. Zu Ihrer Information, hier ist eine fast vollständige Liste der tlds und Ländercode Second Level Domains Liste: static.ayesh.me/misc/SO/tlds.txt
Ayesh K

1
Siehe meine Antwort auf die entsprechende Frage zur Überprüfung des Hostnamens .
SAM

2
Oft vergessen: Für vollqualifizierte Domainnamen sollten Sie einen Zeitraum nach dem tld abgleichen.
schmijos

1
Es ist 4 Jahre her, jetzt sind es bis zu 89.000
Mydoglixu

1
Einige dieser Antworten sind ziemlich gut, aber es gibt auch eine andere gute Antwort auf diese andere Frage , die einen Blick wert ist.
Craftworkgames

Antworten:


49

Nun, es ist ziemlich einfach, etwas hinterhältiger als es aussieht (siehe Kommentare), angesichts Ihrer spezifischen Anforderungen:

/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/

Beachten Sie jedoch, dass dadurch viele gültige Domains abgelehnt werden.


Schön, danke, dieser scheint zu funktionieren. Welche Art von Domains besteht die Validierung nicht, wissen Sie?
Dominic

12
@infensus - Während dieser reguläre Ausdruck angesichts Ihrer Spezifikationen korrekt ist, sind Ihre Spezifikationen falsch. g.coist ein gültiger Domainname, aber gnur ein Zeichen.
sch

3
Dies sollte zu allen Fällen passen, die ich denke: ^ ([a-z0-9]) (([a-z0-9 -] {1,61})? [A-z0-9] {1})? (\. [a-z0-9] (([a-z0-9 -] {1,61})? [a-z0-9] {1})?) \ ([a-zA-Z] {2 , 4}) + $
transilvlad

1
x.com würde hier nicht passieren
Neil McGuigan

4
@Neil: Du hast recht. Die ursprüngliche Frage bestand aus 3-63 Zeichen (siehe Bearbeitung 3). Es kann geändert werden, um Domänen mit einem Zeichen ziemlich einfach zu unterstützen : /^[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 ...
Cameron

84

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 .

  $ idn --quiet -a nic.谷歌
  nic.xn--flw351e

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):

^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$

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:

  1. xn--stackoverflow.com
  2. stackoverflow.xn - com
  3. stackoverflow.co.uk

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:

 ^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$

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.


1
Beachten Sie, dass dies nur maximal eine Subdomain unterstützt. Alles andere führt zu false. Es ist nicht etwas, auf das Sie verleumden müssen, es sei denn, Sie verwenden es für interne Websites usw. Ein schneller Versuch, es zuzulassen, mehr Subdomains zu unterstützen:/^((?!-))(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
Stakolee

1
Aber einsame tld's funktionieren nicht :( Zum Beispiel to.( to. )
Ist eine

@iiic, ja, aber 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 wie testoder naauch einfügen!
Tim Groeneveld

Es akzeptiert invali.dals gültigen Domainnamen, solange invali.d.co.ukes ungültig ist.
Pawel Krakowiak

1
Es ist zu beachten, dass dies xn--stackoverflow.comkein gültiger Name ist, da 'Stackoverflow' nicht aus Punycode konvertiert werden kann. Das geht jedoch über das hinaus, was ein Regex kann. Als allgemeine Bemerkung xn--[a-z0-9]+würden Beschriftungen nur IDN sein, während sie xn--[a-z0-9]+\-[a-z0-9]+eine Mischung aus ASCII- und Nicht-ASCII-Zeichen anzeigen
Marcus

50

Mein 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

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Visualisierung regulärer Ausdrücke

https://www.debuggex.com/r/y4Xe_hDVO11bv1DV

Jetzt wird nach -oder _am Anfang oder Ende des Domain-Labels gesucht.


9
Sieht ziemlich gut aus, aber die {2,6}Kriterien müssen für die neue TLD aktualisiert werden. Wahrscheinlich {2,}.
jwatts1980

@ jwatts1980 gibt es Beispiele für solche Zonen? oder meinst du für mögliche zukünftige zonen?
Paka

1
Hier ist ein Artikel über die bevorstehenden Änderungen mit Beispielen und Links zu verwandten Ressourcen: zdnet.com/…
jwatts1980

1
Warum ([a-zA-Z] {1} [a-zA-Z] {1}) und nicht ([a-zA-Z] {2})?
Anton

3
Der letzte Teil mit den beiden Alternativen ist ebenfalls falsch: Es gibt ccTLDs (zwei Buchstaben), die IDNA-Sublabels akzeptieren. Es gibt jetzt auch TLDs-Labels, die bereits IDNA-Labels verwenden. Sie sollten das letzte Label, das sich nicht von anderen unterscheidet, nicht als Sonderfall verwenden (und jetzt viele Erweiterungen mit variabler Länge hinzugefügt haben, wie alle anderen Labels in Subdomains. Beachten Sie, dass die IDNA-Labels möglicherweise auch punycodiert erscheinen (in diesem Fall wird "-" angezeigt) - "ein Segment im Etikett, der einzige Fall, in dem" - "in Etiketten erlaubt ist. Schließlich ist der Unterstrich überall in allen Etiketten ungültig.
verdy_p

24

Meine Wette:

^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$

Erklärt:

Der Domänenname wird aus Segmenten erstellt. Hier ist ein Segment (außer final):

[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?

Es kann 1-63 Zeichen haben und beginnt oder endet nicht mit '-'.

Fügen Sie jetzt '.' dazu und mindestens einmal wiederholen:

(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+

Fügen Sie dann das letzte Segment hinzu, das 2-63 Zeichen lang ist:

[a-z0-9][a-z0-9-]{0,61}[a-z0-9]

Testen Sie es hier: http://regexr.com/3au3g


@ GaneshBabu Was meinst du mit genauen Übereinstimmungen?
Jaroslaw Stavnichiy

1
Alle anderen Antworten haben bei mir nicht funktioniert, aber diese hat funktioniert.
Danny Coulombe

Ich hatte eine ähnliche Anforderung, bei der ich Semikolon und Komma am Ende vermeiden möchte. Ich habe viel versucht, aber kein Erfolg unten ist der Regex, den ich verwende. Const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-z0-9 -] {0,61} [A-Za-z0-9])? \.) + [A-Za-z0-9] [A-Za-z0-9 -] { 0,61} [A-Za-z0-9] / g; Nun, es überprüft, ob ich benutze, und; dazwischen aber scheitert am Ende zu vliadieren.
Harry

Ich habe mehrere Domains gefunden, die gültig sein sollten, aber mit Ihrer Regex ungültig sind. Zum Beispiel ist редбулл.москва eine gültige Domain oder auch редбулл.рф und 红色 的 公牛. 中国
pubkey

1
@pubkey, müssen Sie diese Domain-Namen in Punycode konvertieren . Der tatsächliche Name für редбулл.москва lautet xn - 90afc0aazy.xn - 80adxhks Und meine Regex stimmt damit überein.
Jaroslaw Stavnichiy

13

Nur eine kleine Korrektur - der letzte Teil sollte bis zu 6 sein.

^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$

Die längste TLD ist museum(6 Zeichen) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains


3
Hinweis: Dies wird nicht den gültigen (noch seltenen) Domainnamen www.my---domain.com
Chris Bier

17
Schneidet es nicht mit neuer TLD zB.photography
Sam Figueroa

2
@ SamFigueroa Sie müssen nur die Länge ändern
Steel Brain

3
Es sollte keine Überprüfung für die TLD geben, die sich nicht von den Subdomains unterscheidet. Und die Regex auf aktuelle availabletlds zu stützen, ist nicht zukunftssicher.
Loïc Faure-Lacroix

1
Schlagen Sie das letzte Bit vor {2,63}: siehe stackoverflow.com/questions/9238640/…
Eric Dobbs

13

Akzeptierte Antwort funktioniert bei mir nicht, versuchen Sie Folgendes:

^ ((?! -) [A-Za-z0-9 -] {1,63} (? <! -) \.) + [A-Za-z] {2,6} $

Besuchen Sie diese Unit Test Cases zur Validierung.


4
Keine Unterstützung für neue längere TLD-Namen wie .audio, .photography und die meisten dieser ... data.iana.org/TLD/tlds-alpha-by-domain.txt
mrbinky3000

@ mrbinky3000 Ändere einfach den letzten {2,6}in etwas anderes und es wird funktionieren. Meins:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod

@ Mygod Ihre Regex enthält etwas Müll mit der Breite Null nach dem letzten Fragezeichen, so dass jeder, der es kopiert, unangenehm überrascht sein wird
MightyPork

1
@MightyPork Du hast recht! Entschuldigung, hier ist eine (hoffentlich) saubere Version:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod

Sehr schön. Leider sind Lookbehind-Ausdrücke in JavaScript nicht gültig. : /
PhiLho

13

Diese Antwort bezieht sich auf Domainnamen (einschließlich Service-RRs) und nicht auf Hostnamen (wie einen E-Mail-Hostnamen).

^(?=.{1,253}\.?$)(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}$

Es ist im Grunde die Antwort von mkyong und zusätzlich:

  • Maximale Länge von 255 Oktetten einschließlich Längenpräfixen und Nullwurzel.
  • Erlaube nachfolgendes '.' für explizite DNS-Wurzel.
  • Zulässiges '_' für Service-Domain-RRs zulassen (Fehler: Erzwingt weder maximal 15 Zeichen für _-Labels, noch ist mindestens eine Domain über Service-RRs erforderlich).
  • Entspricht allen möglichen TLDs.
  • Erfasst keine Subdomain-Labels.

Nach Teilen

Lookahead, begrenzen Sie die maximale Länge zwischen ^ $ und 253 Zeichen mit dem optionalen nachgestellten Literal '.'

(?=.{1,253}\.?$)

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.

[A-Za-z0-9-_]{1,63}

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.).

(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}

Unit-Tests für diesen Ausdruck.


1
Vielen Dank! Dies ist die beste Regex hier. Ihre gründliche Erklärung und Ihr Unit-Test sind ein Bonus.
Naudster

Was bedeutet "RR"?
Wheeler

Ressourceneintrag. Normalerweise ein Text- oder Informationsfeld, in dem Sie erfahren, wie Sie mit einem Dienst interagieren.
Andrew Domaszek

Dieser reguläre Ausdruck ist nicht korrekt. Zum Beispiel ist die Domain redbull. 移动 gültig, aber der reguläre Ausdruck stimmt nicht überein.
Pubkey

Zuerst in Punycode konvertieren, dann abgleichen. Längenbeschränkungen für die Pre-Punycode-Version sind sehr schwer zu implementieren.
Andrew Domaszek

8

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:

  • google.com
  • masełkowski.pl
  • maselkowski.pl
  • m.maselkowski.pl
  • www.masełkowski.pl.com
  • xn--masekowski-d0b.pl
  • 中国 互联 网络 信息 中心. 中国
  • xn - fiqa61au8b7zsevnm8ak20mc4a87e.xn - fiqs8s

Regex ist:

^[0-9\p{L}][0-9\p{L}-\.]{1,61}[0-9\p{L}]\.[0-9\p{L}][\p{L}-]*[0-9\p{L}]+$

Ü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.


Wir können nur [:alpha:]und [:digit]statt verwenden \p{L}. Es funktioniert gut.
Puchu

Sie können eine IDN nicht auf diese Weise validieren, ohne sie zuvor in Punycode konvertiert zu haben. Beispiel: Mit Ihrem Ausdruck wird 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国ü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.
Andrew Domaszek

Guter Punkt, jeder Teil ist auf 64 Bytes begrenzt. Wir können dies jedoch nicht mit RegExp überprüfen, sodass weitere Validierungsschritte mit dem Punycode-Decoder erforderlich sind. Dies schlägt mit Ihrem Beispiel-Hostnamen fehl. Die Chinesen müssen von dieser Einschränkung verrückt sein.
PeterM

7
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}$

[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.


1
Warum TLDs einschränken? Jetzt .photographywäre ungültig. Machen Sie es einfach unbegrenzt Zeichen oder so etwas.
Adria

5

Noch nicht genug Repräsentanten, um einen Kommentar abzugeben. Als Reaktion auf Pakas Lösung stellte ich fest, dass ich drei Elemente anpassen musste:

  • Der Bindestrich und der Unterstrich wurden verschoben, da der Bindestrich als Bereich interpretiert wurde (wie in "0-9").
  • Es wurde ein Punkt für Domain-Namen mit vielen Subdomains hinzugefügt
  • Die potenzielle Länge für die TLDs wurde auf 13 erweitert

Vor:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Nach dem:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][-_\.a-zA-Z0-9]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

3

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):

  • Maximal 253 Zeichen lang (gemäß RFC-1035 / 3.1 , RFC-2181/11 )
  • Maximal 63 Zeichen pro Etikett (gemäß RFC-1035 / 3.1 , RFC-2181/11 )
  • Beliebige Zeichen sind zulässig (gemäß RFC-2181/11 ).
  • TLDs können nicht rein numerisch sein (gemäß RFC-3696/2) )
  • FQDNs können in einer vollständigen Form geschrieben werden, die die Stammzone (den nachfolgenden Punkt) enthält.

Praktischer / konservativer FQDN-Abgleich (praktische Definition, in der Praxis erwartet und unterstützt):

  • by-the-books, die mit den folgenden Ausnahmen / Ergänzungen übereinstimmen
  • gültige Zeichen: [a-zA-Z0-9.-]
  • Etiketten können nicht mit Bindestrichen beginnen oder enden (gemäß RFC-952 und RFC-1123 / 2.1 ).
  • Die minimale TLD-Länge beträgt 2 Zeichen, die maximale Länge beträgt 24 Zeichen gemäß den derzeit vorhandenen Datensätzen
  • Nicht mit dem nachfolgenden Punkt übereinstimmen


2

Hier ist der vollständige Code mit Beispiel:

<?php
function is_domain($url)
{
    $parse = parse_url($url);
    if (isset($parse['host'])) {
        $domain = $parse['host'];
    } else {
        $domain = $url;
    }

    return preg_match('/^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$/', $domain);
}

echo is_domain('example.com'); //true
echo is_domain('https://example.com'); //true
echo is_domain('https://.example.com'); //false
echo is_domain('https://localhost'); //false

2

Für neue gTLDs

/^((?!-)[\p{L}\p{N}-]+(?<!-)\.)+[\p{L}\p{N}]{2,}$/iu

2
Bitte geben Sie uns einige Details, was Ihre Antwort besser macht als die anderen? Was passt mehr zu Ihnen? Bitte bearbeiten Sie Ihren Beitrag direkt, um die Informationen hinzuzufügen.
Sven R.

Wie ich geschrieben habe: neue gTLDs. Domänen mit Unicode-Zeichen und auch Unicode-TLDs.
Ben Keil

1
@BenKeil: Was diesen Teil über ist: (<-?!)
jor

@jor das ist negativ hinterher schauen. Überprüfen Sie dies aus shortcutfoo.com/app/dojos/regex/cheatsheet
Muhammad Faizan

2
^((localhost)|((?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,253})$

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.


0
/^((([a-zA-Z]{1,2})|([0-9]{1,2})|([a-zA-Z0-9]{1,2})|([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]))\.)+[a-zA-Z]{2,6}$/
  • ([a-zA-Z]{1,2}) -> um nur zwei Zeichen zu akzeptieren.

  • ([0-9]{1,2})-> nur zum Akzeptieren von zwei Nummern

Wenn 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.


0

^ [a-zA-Z0-9] [- a-zA-Z0-9] + [a-zA-Z0-9]. [az] {2,3} ([az] {2,3}) ? (. [az] {2,3})? $

Beispiele, die funktionieren:

stack.com
sta-ck.com
sta---ck.com
9sta--ck.com
sta--ck9.com
stack99.com
99stack.com
sta99ck.com

Es funktioniert auch für Erweiterungen

.com.uk
.co.in
.uk.edu.in

Beispiele, die nicht funktionieren:

-stack.com

Es funktioniert auch mit der längsten Domain-Endung ".versicherung"



0

Der folgende reguläre Ausdruck extrahiert das Sub, root und tld einer bestimmten Domain:

^(?<domain>(?<domain_sub>(?:[^\/\"\]:\.\s\|\-][^\/\"\]:\.\s\|]*?\.)*?)(?<domain_root>[^\/\"\]:\s\.\|\n]+\.(?<domain_tld>(?:xn--)?[\w-]{2,7}(?:\.[a-zA-Z-]{2,3})*)))$

Getestet für folgende Domains:

* stack.com
* sta-ck.com
* sta---ck.com
* 9sta--ck.com
* sta--ck9.com
* stack99.com
* 99stack.com
* sta99ck.com
* google.com.uk
* google.co.in

* google.com
* masełkowski.pl
* maselkowski.pl
* m.maselkowski.pl
* www.masełkowski.pl.com
* xn--masekowski-d0b.pl
* xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s

* xn--stackoverflow.com
* stackoverflow.xn--com
* stackoverflow.co.uk

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.