So che questo è un po 'un vecchio post, ma a tutte le espressioni regolari qui manca una componente molto importante: il supporto per i nomi di dominio IDN.
I nomi di dominio IDN iniziano con xn--. Abilitano i caratteri UTF-8 estesi nei nomi di dominio. Ad esempio, sapevi che "♡ .com" è un nome di dominio valido? Sì, "love heart dot com"! Per convalidare il nome di dominio, è necessario consentire a http://xn--c6h.com/ di superare la convalida.
Nota, per utilizzare questa regex, dovrai convertire il dominio in minuscolo e utilizzare anche una libreria IDN per assicurarti di codificare i nomi di dominio in ACE (noto anche come "ASCII Compatible Encoding"). Una buona libreria è GNU-Libidn.
idn (1) è l'interfaccia della riga di comando per la libreria dei nomi di dominio internazionalizzata. L'esempio seguente converte il nome host in UTF-8 nella codifica ACE. L'URL risultante https: //nic.xn--flw351e/ può quindi essere utilizzato come equivalente con codifica ACE di https: // nic. 谷 歌 / .
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
Questa magica espressione regolare dovrebbe coprire la maggior parte dei domini (anche se, sono sicuro che ci sono molti casi limite validi che ho perso):
^((?!-))(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,})$
Quando scegli una regex di convalida del dominio, dovresti vedere se il dominio corrisponde a quanto segue:
- xn--stackoverflow.com
- stackoverflow.xn - com
- stackoverflow.co.uk
Se questi tre domini non vengono superati, la tua espressione regolare potrebbe non consentire domini legittimi!
Controlla la pagina Internationalized Domain Names Sostegno da manuale International Language Environment di Oracle per ulteriori informazioni.
Sentiti libero di provare la regex qui: http://www.regexr.com/3abjr
ICANN mantiene un elenco di tld che sono stati delegati che possono essere utilizzati per vedere alcuni esempi di domini IDN.
Modificare:
^(((?!-))(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,})$
Questa espressione regolare interromperà i domini che hanno "-" alla fine di un nome host come contrassegnati come validi. Inoltre, consente un numero illimitato di sottodomini.