Domanda

Così, ho lavorato su questo nome di dominio espressione regolare. Finora, sembra per raccogliere nomi a dominio con SLD e domini di primo livello (con il ccTLD optional), ma v'è la duplicazione della quotazione TLD. questo può essere riscritta ogni ulteriore?

params[:domain_name].downcase.strip.match(/^[a-z0-9\-]{2,63}
\.((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|
(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|
(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|
(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|
(m[acdghklmnopqrstuvwxyz]|me|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|
(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|
(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])
(\.((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|
(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|
(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|
(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|
m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|
(n[acefgilopruz]|name|net)|(om|org)|
(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|
(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]))?$/)
È stato utile?

Soluzione

Per favore, per favore, non usare una regex fisso e orribilmente complicato come questo per abbinare i nomi di dominio noti.

L'elenco dei domini di primo livello è non statica, in particolare con l'ICANN guardando un processo semplificato per i nuovi gTLD. Anche l'elenco dei ccTLD cambia a volte!

Dai un'occhiata alla lista di quelli disponibili da http://publicsuffix.org/ e scrivere del codice che è in grado di scaricare e analizzare tale elenco, invece.

Altri suggerimenti

Scarica questo: http://data.iana.org/ TLD / TLD-alfa-by-domain.txt

Esempio di utilizzo (in Python):

import re
def validate(domain):
    valid_domains = [ line.upper().replace('.', '\.').strip() 
                      for line in open('domains.txt') 
                      if line[0] != '#' ]
    r = re.compile(r'^[A-Z0-9\-]{2,63}\.(%s)$' % ('|'.join(valid_domains),))
    return True if r.match(domain.upper()) else False


print validate('stackoverflow.com')
print validate('omnom.nom')

È possibile fattore dominio-list-costruzione fuori dalla funzione di Convalida per aiutare le prestazioni.

Non conosco abbastanza circa i nomi di dominio, probabilmente. Ma perché è domini come "foo.info.com" in tinta? Sembra che il nome di dominio è "info.com" in questo caso particolare.

E si potrebbe desiderare di assicurarsi che il nome inizia con [a-z \ d]. Non credo che si può registrare un dominio che inizia con un trattino?

Beh, come avete scritto, la parte TLD è equivalente ma più lungo di (\.<tldpart>){1,2} ma sono sicuro che potrebbe essere fissato per la duplicazione ...

modifica: yech, no, sarebbe possibile, ma essenzialmente una lista forza bruta molto lento per gestire le duplicazioni credo. Più semplice e più veloce per mettere il possibile TLD e coppie SLD + paese in una grande HashMap e controllare la sottostringa contro quella.

Mi consiglia di cominciare con le norme previste nel RFC 1035 , e poi a ritroso - ma solo se davvero davvero davvero bisogno di fare questo da zero. Un modello di dominio espressione regolare ha avuto modo di essere (discutibile secondo solo a modelli di indirizzo e-mail regex) la cosa più comune là fuori. Vorrei verificare il sito regexlib.com e navigare attraverso quello che altre persone hanno fatto.

È possibile costruire la regex come una stringa e poi fare Regexp.new (stringa).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top