2009-09-13 22 views
28

Sto cercando il regex per convalidare i nomi host. Deve essere completamente conforme allo standard. In questo momento, hoNome host Regex

^[0-9a-z]([0-9a-z\-]{0,61}[0-9a-z])?(\.[0-9a-z](0-9a-z\-]{0,61}[0-9a-z])?)*$

ma permette hypens successivi e nomi host più lunghi di 255 caratteri. Se la regex perfetta è impossibile, dillo.

Modifica/Chiarimento: una ricerca su Google non ha rivelato che si tratta di un problema risolto (o dimostrato irrisolvibile). Voglio creare la regex definitiva in modo che nessuno debba scrivere il proprio mai. Se i dialetti sono importanti, voglio una versione per ognuno in cui ciò può essere fatto.

risposta

27

^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?$

+2

Non accetta domini con "." Finale. ma in caso contrario, funziona. – nicerobot

+0

corretto. Mi chiedo se l'asserzione della lunghezza debba controllare se è 254 o meno escludendo il punto finale invece di verificare se è 255 o meno. Altrimenti qualcuno lungo la linea potrebbe aggiungere il punto finale a un nome host di lunghezza massima e romperlo. – CannibalSmith

+1

Il \ b prima del trattino impedisce che questo corrisponda ai nomi di dominio internazionalizzati validi, ad es. xn--bcher-kva.ch. –

1

Dai un'occhiata alla seguente domanda. Alcune delle risposte sono espressioni regex per i nomi host

Potrebbe specificare quali lingua che si desidera utilizzare questo regex in? La maggior parte delle lingue/sistemi hanno implementazioni regex leggermente differenti che influenzeranno le risposte delle persone.

+1

sto utilizzando .NET, ma voglio la regex di essere il più portabile possibile così che anche altre persone possano usarlo. – CannibalSmith

+0

Fintanto che manterrai il tuo Regex, scoprirai che i tuoi progressi guadagnati sono estremamente portatili tra gli ambienti. – Hardryv

4

La tua risposta era relativamente vicina.

Ma vedi

Per un RE host, che perl module produce

(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]|[a-zA-Z])[.]?) 

Vorrei modificare per essere più precisi come:

(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]{0,61})?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]|[a-zA-Z])[.]?) 

Facoltativamente ancoraggio delle estremità con ^$ a SOLO ma tch nomi host.

Non credo che un singolo RE possa eseguire una convalida completa perché, in base allo Wikipedia, esiste una restrizione di 255 caratteri che non penso possa essere inclusa in quella stessa RE, almeno non senza una tonnellata di modifiche, ma è abbastanza semplice controllare la lunghezza < = 255 prima di eseguire la RE.

0

Che dire:

^(?=.{1,255})([0-9A-Za-z]|_{1}|\*{1}$)(?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?)*\.?$ 

per la corrispondenza solo un '_' (per alcuni SRV) all'inizio e una sola * (in caso di un'etichetta per una wildcard DNS)

7

La risposta approvata valida nomi host non validi contenenti più punti (esempio..com). Ecco una regex che ho trovato e penso che corrisponda esattamente a ciò che è permesso dai requisiti RFC (meno un finale "."Supportata da alcuni risolutori per corto circuito denominazione relativa e forza risoluzione FQDN)

Spec:. ​​

<hname> ::= <name>*["."<name>] 
<name> ::= <letter-or-digit>[*[<letter-or-digit-or-hyphen>]<letter-or-digit>] 

Regex:

^([a-zA-Z0-9](?:(?:[a-zA-Z0-9-]*|(?<!-)\.(?![-.]))*[a-zA-Z0-9]+)?)$ 

ho provato un bel po 'permutazioni me stesso,

Questa espressione regolare non esegue la convalida della lunghezza.I vincoli di lunghezza sulle etichette tra i punti e i nomi sono richiesti da RFC, ma le lunghezze possono essere facilmente ch ecked come secondo e terzo passaggio dopo la convalida contro questa regex, controllando la lunghezza della stringa intera e dividendo su "." e convalidando tutte le lunghezze delle sottostringhe. Ad esempio, in JavaScript, la convalida della lunghezza dell'etichetta può essere simile a: "example.com".split(".").reduce(function (prev, curr) { return prev && curr.length <= 63; }, true).


alternativa Regex (senza lookbehind negativo, per gentile concessione @thom_nic):

^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)+(\.([a-zA-Z0-9]+(-[a-zA-Z0-9‌​]+)*))*$

+1

Non ho potuto utilizzare un lookbehind negativo (grazie a JS), quindi ho trovato questo che è molto simile: '^ ([a-zA -Z0-9] + (- [a-zA-Z0-9] +) *) + (\ ([a-zA-Z0-9] + (-. [a-zA-Z0-9] +) *)) * $ '- di nuovo non controlla la lunghezza ma * fa * non convalida in anticipo/in coda/ripetendo' -' o '.'. Funziona su nomi host o nomi di dominio completi. –