2008-12-30 2 views
6

Also, ich habe an diesem regulären Ausdruck Domain Name gearbeitet. Bis jetzt scheint es Domain-Namen mit SLDs und TLDs (mit der optionalen ccTLD) aufzunehmen, aber es gibt eine Verdoppelung der TLD-Auflistung. Kann dies weiter konkretisiert werden?Kann ich diese Regex-Prüfung auf gültige Domänennamen verbessern?

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]))?$/) 
+2

Was ist Ihr Anwendungsfall für eine solche Regex, die beibehalten werden muss, wenn neue Domänen erstellt werden? – mark

+0

Da alle Antworten scheinen, andere Wege zu geben, TLDs zu suchen, schlage ich vor, diese Frage umzubenennen, um Verdoppelung in der Zukunft zu vermeiden (es sei denn, Leute beginnen tatsächlich, die refactoring Frage zu beantworten) – TheSoftwareJedi

+0

gute Idee - es ist wirklich kein regexp Problem. – Alnitak

Antwort

28

Bitte, bitte, bitte nicht Verwenden Sie eine feste und schrecklich komplizierte Regex wie diese für bekannte Domain-Namen zu entsprechen.

Die Liste der TLDs ist nicht statisch, insbesondere mit ICANN Blick auf einen rationalisierten Prozess für neue gTLDs. Auch die Liste der ccTLDs ändert sich manchmal!

Sehen Sie sich die Liste unter http://publicsuffix.org/ an und schreiben Sie einen Code, der diese Liste herunterladen und parsen kann.

+0

Über reguläre Ausdrücke und Augenblutungen: http://www.codinghorror.com/blog/archives/001016.html –

+0

entfernt den Code wieder - jeder noob kann eine Datei aus dem Netz lesen, und ohne die! usw. Handhabung ist nicht sinnvoll. – Alnitak

+0

Ich denke, ich stimme zu. Es gibt bessere Möglichkeiten, es zu tun, aber ich brauche etwas, das unglaublich Registrierungen/Transfers zu tun ist. Irgendwelche anderen Empfehlungen? –

0

Ich weiß nicht genug über Domain-Namen wahrscheinlich. Aber warum passen Domains wie "foo.info.com"? Es scheint, dass der Domain-Name in diesem speziellen Fall "info.com" ist.

Und Sie möchten vielleicht sicherstellen, dass der Name mit [a-z \ d] beginnt. Ich glaube nicht, dass Sie eine Domain registrieren können, die mit einem Bindestrich beginnt?

+0

Nicht alle Domain-Namen sind zweiteilig. Ein einzelnes Teil Beispiel: "ck" ist die Domäne für die Cook-Inseln (versuchen Sie http: // ck oder http://www.ck); meine eigene Domain ist dreiteilig (nichesoftware.co.nz) aufgrund einer Struktur innerhalb der .nz TLD. – Bevan

-1

Nun, wie Sie es geschrieben hat, ist der TLD Teil gleichwertig, aber länger als (\.<tldpart>){1,2} aber ich bin sicher, dass es für die Vervielfältigung behoben werden kann ...

edit: Yech, nein, wäre es möglich, aber im Wesentlichen eine sehr langsame Brute-Force-Liste, um mit den Duplikaten umzugehen, denke ich. Einfacher und schneller die möglichen TLD und SLD + Länderpaare in eine große Hashmap zu legen und den Teilstring davor zu prüfen.

-1

Sie können die Regex als Zeichenfolge erstellen und dann Regexp.new (string) ausführen.

-1

Ich würde empfehlen, mit den Regeln beginnend in RFC 1035 zu beginnen, und dann rückwärts arbeiten - aber nur, wenn Sie wirklich wirklich wirklich das von Grund auf neu machen müssen. Ein Domain-Regex-Muster muss (am zweithäufigsten nur für E-Mail-Adress-Regex-Muster) die am weitesten verbreitete Sache sein. Ich würde die Seite regexlib.com überprüfen und durchsuchen, was andere Leute getan haben.

+0

Der RFC erlaubt technisch nicht alle numerischen Domainteile, aber in der Praxis Registrare und Nameserver erlauben dies seit Jahren. –

4

herunterladen: http://data.iana.org/TLD/tlds-alpha-by-domain.txt

Beispiel Verbrauch (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') 

Sie können aus der Prüf-Funktion die Domain-list-Baufaktor Leistung zu helfen.

+2

Ergebnisse sind nicht wie erwartet für Domains wie awesomedomain.co.uk - die TLD wird nicht als .uk betrachtet es ist .co.uk Es ist besser, etwas wie http://publicssuffix.org/ –

+0

@DanEsparza zu verwenden: Und dennoch, [publicssuffix.org] (http://publicssuffix.org/) zeichnet es als "* .uk" und _not_ als "co.uk" auf. –

+0

@DennisWilliamson das '*' im Eintrag für '* .uk' bedeutet, dass jede _sub-Domain_ von' .uk' öffentlich ist _ausgenommen für die explizit aufgeführten_. – Alnitak