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:
- xn--stackoverflow.com
- stackoverflow.xn - com
- 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.