Che cos'è un'espressione regolare che corrisponderà a un nome di dominio valido senza un sottodominio?


123

Devo convalidare un nome di dominio:

google.com

stackoverflow.com

Quindi un dominio nella sua forma più grezza, nemmeno un sottodominio come www.

  1. I caratteri devono essere solo az | AZ | 0-9 e periodo (.) E trattino (-)
  2. La parte del nome di dominio non deve iniziare o terminare con un trattino (-) (ad es. -Google-.com)
  3. La parte del nome di dominio deve avere una lunghezza compresa tra 1 e 63 caratteri
  4. L'estensione (TLD) può essere qualsiasi cosa sotto le regole n. 1 per ora, potrei convalidarle rispetto a un elenco in seguito, dovrebbe essere 1 o più caratteri però

Modifica: TLD è apparentemente 2-6 caratteri così com'è

no. 4 rivisto: TLD dovrebbe effettivamente essere etichettato come "sottodominio" in quanto dovrebbe includere cose come .co.uk - Immagino che l'unica convalida possibile (a parte il controllo con un elenco) sarebbe 'dopo il primo punto dovrebbe essercene uno o più personaggi secondo le regole # 1

Grazie mille, credimi, ci ho provato!


1
Potrebbe non essere affatto utile. Quando si tratta di google.co.uk e di alcuni domini giapponesi, sono sicuro che dovrai pensarci due volte prima di utilizzare regex per questo. Il mio pensiero personale è che regex non è sufficiente per convalidare un dominio in un dominio della vita reale. Cordiali saluti, ecco un elenco quasi completo di tld e elenco di domini di secondo livello con codice paese: static.ayesh.me/misc/SO/tlds.txt
Ayesh K

1
Vedi la mia risposta alla domanda correlata sulla convalida del nome host .
SAM

2
Spesso dimenticato: per i nomi di dominio completi qualificati è necessario abbinare un punto dopo il tld.
schmijos

1
sono passati 4 anni, ora il conteggio è salito a 89.000
mydoglixu

1
Alcune di queste risposte sono abbastanza buone, ma c'è anche un'altra buona risposta su quest'altra domanda che vale la pena dare un'occhiata.
giochi di artigianato

Risposte:


49

Bene, è abbastanza semplice, un po 'più subdolo di quanto sembri (vedi commenti), date le tue esigenze specifiche:

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

Ma tieni presente che questo rifiuterà molti domini validi.


Grazie mille, questo sembra funzionare. Che tipo di domini non supereranno la convalida, sai?
Dominic

12
@infensus - Sebbene questa regex sia corretta in base alle tue specifiche, le tue specifiche sono sbagliate. g.coè un nome di dominio valido ma gè un solo carattere.
sch

3
Penso che dovrebbe corrispondere a tutti i casi: ^ ([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 non passerebbe qui
Neil McGuigan

4
@ Neil: hai ragione. La domanda originale richiedeva 3-63 caratteri (vedi modifica 3). Può essere modificato per supportare i domini di un carattere abbastanza facilmente: /^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/. Ma questo rifiuta ancora tonnellate di materiale valido ...
Cameron

85

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:

  1. xn--stackoverflow.com
  2. stackoverflow.xn - com
  3. 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.


1
Nota che questo supporterà solo un massimo di un sottodominio, qualsiasi cosa in più risulterà falso. Non è qualcosa in cui sei diffamatorio a meno che non lo usi per siti interni, ecc ... Un rapido tentativo per consentirgli di supportare più sottodomini:/^((?!-))(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
Ma i tld solitari non funzionano :( Ad esempio to.( a. ) È un URL valido con contenuto.
iiic

@iiic, sì, ma to.non è un nome di dominio completo. Se vuoi consentire i domini di primo livello, dovresti usare qualcosa di simile ^(((?!-))(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,})\.?$, ma attenzione, lascerai passare le persone che inseriscono domini come testo na, anche!
Tim Groeneveld

Accetta invali.dcome nome di dominio valido mentre invali.d.co.uknon è valido.
Pawel Krakowiak

1
Va notato che xn--stackoverflow.comnon è un nome valido in quanto "stackoverflow" non può essere convertito da Punycode. Questo però è al di là di ciò che può fare una regex. Come osservazione generale, le xn--[a-z0-9]+etichette sarebbero solo IDN mentre xn--[a-z0-9]+\-[a-z0-9]+indicano un mix di caratteri ASCII e non ASCII
Marcus

50

La mia RegEx è la prossima:

^[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})$

va bene per i.oh1.me e per wow.british-library.uk

UPD

Ecco la regola aggiornata

^(([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})$

Visualizzazione di espressioni regolari

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

ora controlla -o _all'inizio o alla fine dell'etichetta di dominio.


9
Sembra abbastanza buono, ma i {2,6}criteri dovranno essere aggiornati per il nuovo TLD. Probabilmente {2,}.
jwatts1980

@ jwatts1980 ci sono esempi di tali zone? o intendi per possibili zone future?
paka

1
Ecco un articolo che discute delle modifiche imminenti con esempi e collegamenti a risorse correlate: zdnet.com/…
jwatts1980

1
Perché ([a-zA-Z] {1} [a-zA-Z] {1}) e non ([a-zA-Z] {2})?
Anton

3
anche l'ultima parte con le due alternative è sbagliata: esistono ccTLD (due lettere) che accettano sottoetichette IDNA. Esistono ora anche etichette TLD che utilizzano già etichette IDNA. Non dovresti inserire in un caso speciale l'ultima etichetta che non è diversa dalle altre (e ora ha molte estensioni aggiunte con lunghezze variabili, ma come tutte le altre etichette nei sottodomini. Nota che anche le etichette IDNA potrebbero apparire Punycoded (nel qual caso ci sarà "- - "un segmento nell'etichetta, l'unico caso in cui" - "è consentito nelle etichette .. Infine, il carattere di sottolineatura non è valido ovunque in tutte le etichette.
verdy_p

24

La mia scommessa:

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

Ha spiegato:

Il nome di dominio è costruito da segmenti. Ecco un segmento (eccetto finale):

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

Può contenere da 1 a 63 caratteri, non inizia o termina con "-".

Ora aggiungi "." ad esso e ripeti almeno una volta:

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

Quindi allega il segmento finale, che è lungo 2-63 caratteri:

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

Provalo qui: http://regexr.com/3au3g


@GaneshBabu Cosa intendi per corrispondenze esatte?
Yaroslav Stavnichiy

1
Tutte le altre risposte non hanno funzionato per me, ma questa ha funzionato.
Danny Coulombe

Avevo un requisito simile in cui voglio evitare il punto e virgola e la virgola alla fine ho provato molto ma nessun successo sotto è il Regex che sto usando 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; Bene, convalida se uso, e; nel mezzo ma non riesce alla fine a vliadate.
Harry

Ho trovato diversi domini che dovrebbero essere validi ma non sono validi con la tua regex. Ad esempio редбулл.москва è un dominio valido o anche редбулл.рф e 红色 的 公牛. 中国
pubkey

1
@pubkey, devi convertire quei nomi di dominio in punycode . Il nome effettivo di редбулл.москва è xn - 90afc0aazy.xn - 80adxhks E la mia espressione regolare lo corrisponde.
Yaroslav Stavnichiy,

13

Solo una piccola correzione: l'ultima parte dovrebbe essere fino a 6. Quindi,

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

Il TLD più lungo è museum(6 caratteri): http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains


3
Nota: questo non passerà il nome di dominio valido (ma raro) www.my---domain.com
Chris Bier,

17
Non lo taglia con il nuovo TLD ad esempio.photography
Sam Figueroa

2
@SamFigueroa Dovrai solo modificarne la lunghezza
Steel Brain

3
non dovrebbe esserci un controllo per il TLD non è diverso dai sottodomini. E basare la regex sugli attuali availabletld non è a prova di futuro.
Loïc Faure-Lacroix

1
Suggerimento per l'ultima volta {2,63}: vedi stackoverflow.com/questions/9238640/…
Eric Dobbs

13

La risposta accettata non funziona per me, prova questo:

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

Visita questi casi di test unitario per la convalida.


4
nessun supporto per nuovi nomi TLD più lunghi come .audio, .photography e la maggior parte di questi ... data.iana.org/TLD/tlds-alpha-by-domain.txt
mrbinky3000

@ mrbinky3000 Cambia semplicemente l'ultimo {2,6}con qualcos'altro e funzionerà. Mio:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod

@Mygod, la tua regex contiene spazzatura di larghezza zero oltre l'ultimo punto interrogativo, quindi chiunque lo copi sarà spiacevolmente sorpreso
MightyPork

1
@MightyPork Hai ragione! Scusa, ecco una versione pulita (si spera):^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod

Molto bella. Purtroppo, le espressioni lookbehind non sono valide in JavaScript. : /
PhiLho

13

Questa risposta è per i nomi di dominio (inclusi i RR di servizio), non per i nomi host (come un nome host di posta elettronica).

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

È fondamentalmente la risposta di mkyong e inoltre:

  • Lunghezza massima di 255 ottetti inclusi i prefissi di lunghezza e la radice nulla.
  • Consenti finale "." per root dns esplicito.
  • Consenti "_" iniziale per i RR del dominio di servizio, (bug: non applica un massimo di 15 caratteri per le etichette _, né richiede almeno un dominio sopra i RR del servizio)
  • Corrisponde a tutti i possibili TLD.
  • Non acquisisce le etichette del sottodominio.

Per parti

Lookahead, limita la lunghezza massima tra ^ $ e 253 caratteri con il valore letterale finale facoltativo "."

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

Guarda avanti, il carattere successivo non è un "-" e nessun "_" segue alcun carattere prima del successivo ".". Vale a dire, imponi che il primo carattere di un'etichetta non sia un "-" e solo il primo carattere possa essere un "_".

(?!-|[^.]+_)

Tra 1 e 63 dei caratteri consentiti per etichetta.

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

Guarda dietro, il personaggio precedente non è "-". Vale a dire, imponi che l'ultimo carattere di un'etichetta non sia un "-".

(?<!-)

Forza un "." alla fine di ogni etichetta tranne l'ultima, dove è facoltativa.

(?:\.|$)

Per lo più combinato dall'alto, ciò richiede almeno due livelli di dominio, il che non è del tutto corretto, ma di solito è un presupposto ragionevole. Cambia da {2,} a + se desideri consentire l'uso di TLD o sottodomini relativi non qualificati (ad esempio, localhost, myrouter, to.)

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

Test unitari per questa espressione.


1
Grazie! Questa è la migliore espressione regolare qui. La tua spiegazione approfondita e il test dell'unità sono un bonus.
Naudster

Cosa significa "RR"?
Wheeler

Record di risorse. Di solito un testo o un campo informativo che ti dice come interagire con un servizio.
Andrew Domaszek

Questa regex non è corretta. Ad esempio, il dominio redbull. 移动 è valido ma la regex non corrisponderà.
pubkey

Converti prima in punycode, quindi abbina. I limiti di lunghezza sulla versione pre-punycode sono davvero difficili da implementare.
Andrew Domaszek

8

Grazie per aver indicato la giusta direzione nelle soluzioni di convalida del nome di dominio in altre risposte. I nomi di dominio possono essere convalidati in vari modi.

Se è necessario convalidare il dominio IDN nella sua forma leggibile dall'uomo , regex\p{L} ti aiuterà. Ciò consente di abbinare qualsiasi carattere in qualsiasi lingua.

Nota che l' ultima parte potrebbe contenere trattini ! Poiché i nomi cinesi codificati punycode potrebbero avere caratteri Unicode in tld.

Sono arrivato alla soluzione che corrisponderà ad esempio:

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

Regex è:

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

Controlla e sintonizza qui

NOTA: questa espressione regolare è abbastanza permissiva, così come il set di caratteri consentito per i nomi di dominio correnti.

AGGIORNAMENTO : ancora più semplificato, come a-aA-Z\p{L}è lo stesso di appena\p{L}

NOTA 2: L'unico problema è che abbinerà domini con doppi punti in esso ..., come masełk..owski.pl. Se qualcuno sa come risolvere questo problema, per favore migliora.


Possiamo solo usare [:alpha:]e [:digit]invece di \p{L}. Funziona bene.
puchu

Non puoi convalidare un IDN in questo modo senza prima convertirlo in punycode. Ad esempio con il tuo expr, 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国controlla come valido, ma dopo la conversione IDN, sono troppi byte per etichetta. \ p {L} corrisponde a simboli, non a byte in codice (che variano da simbolo a simbolo), quindi il conteggio delle ripetizioni non è utile quando si cerca di limitare la sua dimensione post-conversione.
Andrew Domaszek

Buon punto, ogni parte è limitata a 64 byte. Tuttavia non possiamo verificarlo con RegExp, quindi sono necessari ulteriori passaggi di convalida utilizzando il decodificatore punycode, che non funzionerà con il nome host di esempio. I cinesi devono essere pazzi per questa limitazione.
PeterM

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

[dominio - solo lettere minuscole e 0-9] [può contenere un trattino] + [TLD - solo minuscolo, deve essere compreso tra 2 e 7 lettere]
http://rubular.com/ è geniale per testare le espressioni regolari!
Modifica: TLD aggiornato al massimo a 7 caratteri per ".rentals" come sottolineato da Dan Caddigan.


1
Perché limitare i TLD? Ora non .photographysarebbe valido. Rendi solo caratteri illimitati o qualcosa del genere.
adriaan

5

Non abbastanza rappresentante per commentare. In risposta alla soluzione di paka, ho scoperto di dover modificare tre elementi:

  • Il trattino e il trattino basso sono stati spostati perché il trattino veniva interpretato come un intervallo (come in "0-9")
  • Aggiunto un punto fermo per i nomi di dominio con molti sottodomini
  • Estesa la lunghezza potenziale dei TLD a 13

Prima:

^(([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})$

Dopo:

^(([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

Per i nuovi gTLD

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

2
Per favore, forniscici qualche dettaglio in più ciò che rispondi rende migliore degli altri? Cosa combini di più? Modifica direttamente il tuo post per aggiungere le informazioni.
Sven R.

Come ho scritto: nuovi gTLD. Domini con caratteri Unicode e anche TLD Unicode.
Ben Keil

1
@BenKeil: Di cosa parla questa parte: (? <! -)
jor

@jor che è uno sguardo negativo dietro.
Dai

3

Come già sottolineato non è ovvio dire sottodomini in senso pratico (es. .co.ukDomini). Usiamo questa regex per convalidare i domini che si verificano in natura. Copre tutti i casi d'uso pratici che conosco. I nuovi sono i benvenuti. Secondo le nostre linee guida , evita che i gruppi non catturino e gli abbinamenti avidi.

^(?!.*?_.*?)(?!(?:[\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})$

Prova, spiegazione ed esempi: https://regex101.com/r/FLA9Bv/9 ( Nota: attualmente funziona solo in Chrome perché la regex utilizza lookbehind che sono supportati solo in ECMA2018 )

Esistono due approcci tra cui scegliere durante la convalida dei domini.

Corrispondenza FQDN da manuale (definizione teorica, raramente riscontrata nella pratica):

  • max 253 caratteri (secondo RFC-1035 / 3.1 , RFC-2181/11 )
  • lunghezza massima di 63 caratteri per etichetta (secondo RFC-1035 / 3.1 , RFC-2181/11 )
  • tutti i caratteri sono consentiti (come da RFC-2181/11 )
  • I TLD non possono essere tutti numerici (come da RFC-3696/2 )
  • Gli FQDN possono essere scritti in una forma completa, che include la zona radice (il punto finale)

Abbinamento FQDN pratico / conservativo (definizione pratica, prevista e supportata nella pratica):

  • by-the-books corrispondenti alle seguenti eccezioni / aggiunte
  • caratteri validi: [a-zA-Z0-9.-]
  • le etichette non possono iniziare o finire con trattini (come da RFC-952 e RFC-1123 / 2.1 )
  • La lunghezza minima del TLD è di 2 caratteri, la lunghezza massima è di 24 caratteri secondo i record attualmente esistenti
  • non corrispondono al punto finale


2

Ecco il codice completo con l'esempio:

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

Grazie @mkyong per la base della mia risposta. L'ho modificato per supportare etichette accettabili più lunghe.

Inoltre, "localhost" è tecnicamente un nome di dominio valido. Modificherò questa risposta per accogliere i nomi di dominio internazionalizzati.


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}) -> per accettare solo due caratteri.

  • ([0-9]{1,2})-> per accettare solo due numeri

se qualcosa supera i due, ([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])questa regex se ne occuperà.

Se vogliamo fare l'abbinamento per almeno una volta +verrà utilizzato.


0

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

Esempi che funzionano:

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

Funzionerà anche per le estensioni

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

Esempi che non funzioneranno:

-stack.com

funzionerà anche con l'estensione di dominio più lunga ".versicherung"



0

La seguente regex estrae il sub, root e tld di un determinato dominio:

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

Testato per i seguenti domini:

* 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.