Frage

Also, ich habe auf diesem Domain-Namen regulären Ausdruck gearbeitet. Bisher scheint es Domain-Namen mit SLD zu holen und TLDs (mit dem optionalen ccTLD), aber es ist die Vervielfältigung des TLD-Eintrags. Kann dies weiter Refactoring?

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]))?$/)
War es hilfreich?

Lösung

Bitte, bitte, bitte nicht verwenden, um einen festen und schrecklich komplizierte Regex wie dies bei bekannten Domain-Namen entspricht.

Die Liste des TLDs ist nicht statisch, vor allem bei ICANN für neue gTLDs zu einem optimierten Prozess suchen. Auch die Liste der ccTLDs ändert sich manchmal!

Haben Sie einen Blick auf die Liste verfügbar von http://publicsuffix.org/ und einige Code schreiben, die fähig ist, zu herunterladen und analysiert diese Liste statt.

Andere Tipps

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

Beispiel für die Verwendung (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 die Domain-Liste-Baufaktor aus der Prüf-Funktion Leistung zu helfen.

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

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

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 Duplizierung festgelegt werden könnte ...

edit: Yech, nein, wäre es möglich, aber im Wesentlichen eine sehr langsame Brute-Force-Liste, um die Vervielfältigungen Ich denke, zu behandeln. Einfachere und schnellere setzt die möglichen TLD und SLD + Länderpaare in einem großen hashmap und überprüfen den Teil dagegen.

Ich würde empfehlen, mit den Regeln ab RFC 1035 rel="nofollow und dann rückwärts arbeiten - aber nur, wenn Sie wirklich wirklich wirklich das von Grund auf tun. Eine Domain RegexMuster hat ausstieg es die häufigste Sache zu sein (arguable an zweiter Stelle nach E-Mail-Adresse regex Muster). Ich würde die Website regexlib.com und blättern Sie durch, was andere Leute getan haben.

Sie können die Regex als String aufbauen und führen Sie dann Regexp.new (string).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top