2010-07-07 12 views
8

Kennt jemand einen regulären Ausdruck, um Domain.CCTLD zu entsprechen? Ich will keine Subdomains, nur die "atomare Domäne". Zum Beispiel wird docs.google.com nicht gefunden, aber google.com tut. Dies wird jedoch kompliziert mit Sachen wie .co.uk, CCTLDs. Kennt jemand eine Lösung? Danke im Voraus.Regex, um Domain.CCTLD zu entsprechen

EDIT: Ich habe festgestellt, dass ich auch mit mehreren Subdomains beschäftigen muss, wie john.doe.google.co.uk. Brauche jetzt mehr denn je eine Lösung: P.

+0

Sie benötigen explizit eine regex, oder wäre eine Funktion, es zu tun ausreichen ? – Benson

+0

Dies würde ein ziemlich großer Regex werden, da Sie alle ccSLDs als Spezialfälle behandeln müssen, und es gibt eine Menge (und ich meine A LOT) von ccSLDs. Brasilien hat 66 von ihnen! – You

+0

@Benson, eine Funktion würde funktionieren, solange sie domain.cctld in einer langen Liste von Domänen finden könnte – Tom

Antwort

3

Basierend auf Ihrem Kommentar oben, werde ich die Frage neu interpretieren - anstatt eine Regex zu machen, die ihnen entspricht, Wir werden eine Funktion erstellen, die ihnen entspricht, und diese Funktion anwenden, um eine Liste von Domänennamen zu filtern, die nur erstklassige Domänen enthalten, z google.com, amazon.de.

Zuerst benötigen wir eine Liste der TLDs. Wie Greg bereits erwähnt hat, ist die öffentliche Suffixliste ein großartiger Ausgangspunkt. Nehmen wir an, Sie haben die Liste in ein Python-Array namens suffixes geparst. Wenn das etwas ist, mit dem Sie nicht zufrieden sind, kommentieren Sie und ich kann Code hinzufügen, der das tut.

suffixes = parse_suffix_list("suffix_list.txt") 

Jetzt werden wir Code benötigen, die eine bestimmte Domain-Namen identifiziert, ob das Muster passt etwas-name.suffix:

def is_domain(d): 
    for suffix in suffixes: 
     if d.endswith(suffix): 
      # Get the base domain name without suffix 
      base_name = d[0:-(suffix.length + 1)] 
      # If it contains '.', it's a subdomain. 
      if not base_name.contains('.'): 
       return true 
    # If we get here, no matches were found 
    return false 
+0

Vielen Dank! Ich kann meinen Weg von hier finden. – Tom

+0

Kein Problem! Froh, dass ich helfen konnte. – Benson

+4

Sie können jetzt ein einfaches, aber exzellentes Python-Paket verwenden, um die Schwerarbeit dafür zu erledigen: http://pypi.python.org/pypi/publicsuffix –

-3
^[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)$ 
+0

Lesen Sie die ganze Frage, das ist keine Lösung. – You

+0

Wie ich in meiner Frage erwähnt habe, brauche ich einen Regulären Ausdruck, der Dinge wie '.co.uk' oder' .edu.hk' finden kann, nicht nur normale TLDs. – Tom

+0

"Du", schlag mich dazu. – Tom

8

Es klingt, als ob Sie nach den Informationen suchen, die über das Projekt Public Suffix List verfügbar sind.

Mit einem "öffentlichen Suffix" können Internetbenutzer Namen direkt registrieren. Einige Beispiele für öffentliche Suffixe sind ".com", ".co.uk" und "pvt.k12.wy.us". Die Liste der öffentlichen Suffixe ist eine Liste aller bekannten öffentlichen Suffixe.

Es gibt keinen einzelnen regulären Ausdruck, der mit der Liste der öffentlichen Suffixe übereinstimmen würde. Sie müssen Code implementieren, um die öffentliche Suffixliste zu verwenden, oder eine vorhandene Bibliothek finden, die dies bereits tut.

+0

Interessante und wahrscheinlich sehr nützliche Liste. – You

+1

Danke, Greg. Das ist absolut die richtige Antwort. Es gibt Bibliotheken, die öffentliche Suffixlisten in mehreren Sprachen bearbeiten können: http://www.dkim-reputation.org/regdom-libs/ – Anirvan

+0

@Anirvan, kennst du ein Äquivalent für Python? Die von Ihnen gepostete Bibliothek ist nur in C, PHP und Perl verfügbar. – Tom

2

Ich würde wahrscheinlich dies lösen, indem Sie eine vollständige Liste der TLDs und damit die Regex erstellen. Zum Beispiel (in Ruby, sorry, kein Pythonista noch):

tld_alternation = ['\.com','\.co\.uk','\.eu','\.org',...].join('|') 
regex = /^[a-z0-9]([a-z0-9\-]*[a-z0-9])?(#{tld_alternation})$/i 

Ich glaube nicht, es möglich ist, richtig zwischen einem echten zweiteiligen TLD und einer Sub-Domain zu unterscheiden, ohne die tatsächliche Liste des TLDs zu wissen (dh: Sie könnten immer eine Subdomain erstellen, die wie eine TLD aussieht, wenn Sie wüssten, wie die Regex funktioniert.)