2010-11-29 5 views
1

Ich möchte die Subdomain und Domain-Teil für Domains mit beliebigen Top-Level-Erweiterungen extrahieren.PHP Regex zum Extrahieren von Subdomains beliebiger Domänen

So:

sub1.domain1.com -> Extract Sub-Domain = sub1, domain = domain1.com

sub2.domain2.co.in -> Extract Sub-Domain = sub2, domain = domain2 .co.in

sub3.domain3.co.uk -> Extract Sub-Domain = sub3, domain = domain3.co.uk

sub4.domain4.us -> Extract Sub-Domain = sub4, domain = domain4 .us

mydomain.com -> Extract Sub-Domain = "", domain = mydomain.com

mydomain.co.in -> Extract Sub-Domain = "", domain = mydomain.co.in

Ich bin etwas verwirrt wie man mit TLDs wie co.in/co.uk etc. umgehen kann. Ich könnte dies auf routinemäßige Art und Weise tun, indem ich zähle, ob die letzten 5 Zeichen einen DOT (.) enthalten, aber denke darüber nach, ob es einen Regex-Weg gibt .


HINWEIS 1: Wie TToni darauf hingewiesen hat, kann es Unklarheiten geben. Allerdings werde ich einige Einschränkungen setzen:

1) Der "Domain name" Teil (ohne die Erweiterung) -> wird mindestens 4 Zeichen sein.

2) Die TLD Verlängerungsteil (.com, co.in, .us, usw.) müssen entweder eine einzelne DOT oder wenn es zwei PUNKTE, dann ist der vorletzte Teil (sub TLD) wird höchstens 3 Zeichen.

Ich habe das Gefühl, dass diese Einschränkungen das Problem mit Regex eindeutig und lösbar machen werden.

(Angenommen, "www." Wurde bereits entfernt).


Anmerkung 2:

Beispiel von oben Einschränkungen

sub.dom.in -> domain = "sub.dom.in"

sub.dom1.in - > domain = "dom1.in", subdomain = "sub"

Das klingt vielleicht buggy, aber der Grund ist - ich will das für meine internen Zwecke, und alle meine Domains haben mindestens 4 Zeichen in ihnen, UND, alle Erweiterungen haben entweder einzelne DOT oder der vorletzte Teil ist maximal 3 Zeichen lang.

HINWEIS 3: Ich habe das Gefühl, ich könnte Fehler machen, indem ich regex dafür verwende. Daher denke ich daran, die Suche nach Zeichenketten zu machen.

Grüßen,

JP

+0

Nicht ganz das gleiche, aber einen Blick auf http://stackoverflow.com/questions/3853338/remove-domain-extension/3853473#3853473 – Gumbo

+1

Ich denke, Sie können das nicht vollständig mit einer Regex lösen, weil Sie Unklarheiten bekommen. Betrachten Sie zum Beispiel "b.ceu". Welches ist die Domain? – TToni

+0

Ich stimme TToni zu. Ich werde meine Frage ändern. Für meinen Zweck nehme ich an, dass der Domainname mindestens 4 Zeichen lang ist. Fügt nach formaler Formulierung noch eine Einschränkung hinzu. –

Antwort

4

Nicht sicher, dass Sie Regexes brauchen. Teilen Sie den Domainnamen auf '.' dann wenden Sie einige heuristics auf dem Ergebnis an, das vom rechtesten Bit abhängt - e..g, wenn letzter "com" ist, dann ist domain das letzte + vorletzte, Subdomain ist der Rest.

Oder behalten Sie eine Liste von "Top-Level" (Anführungsstriche, da es eine andere Bedeutung von der normalen Top-Level-Domains ist), iterieren über die Liste mit dem rechten Ende des Domain-Namen gegen jeden. Wenn eine Übereinstimmung gefunden wird, entfernen Sie das oberste Bit und geben Sie den Rest als Subdomain zurück - dies könnte in eine Regex eingefügt werden, aber mit einem Verlust an Übersichtlichkeit. Die Liste wäre in etwa so aussieht

".edu", ".gov", ".mil", ".com", ".co.uk", ".gov.uk", ".nhs.uk", [...] 

Die Regex so etwas wie

\.(edu|gov|mil|com|co\.uk|gov\.uk|nhs\.uk|[...])$ 
+0

'\. (Edu) | (com) $' entspricht entweder '.edu' (nicht unbedingt gefolgt vom Ende der Eingabe) oder' com', gefolgt vom Eingabeende (ohne '.'!). Du meintest wahrscheinlich '\. (Edu | com | mil | etc) $'. Auch das Setzen von '[..]' in eine Regex könnte als eine merkwürdige (aber legale) Zeichenklasse wahrgenommen werden, während Sie es als etwas anderes meinen. –

+0

Danke, zu schnell getippt. Fest. Und ja, die [...] soll gemein sein "und so weiter" –

+0

Ja, das habe ich mir gedacht. Ich habe mir die Freiheit genommen, die nicht-entflohenen '.'s in Ihrem Beispielregex zu beheben. –

0

Sie diese verwenden können: (\b\w+\b(?:\.\b\w+\b)*?){0,1}?\.?(\b\w+\b(?:\.\b\w{1,3}\b)?\.\b\w{1,3}\b)
Es ist nicht sehr schön aussieht, aber die Idee dahinter ist einfach. Es wird Subdomain in der ersten Gruppe und Domäne in der zweiten fangen. Es teilt auch Dinge wie "sub123.domain2.co.in" in "sub123" und "domain2.coin".

+0

Das Problem ist, dass Sie nicht wissen können, was die tatsächliche Domäne ist. Im Fall des Beispiels: domain2.co.in "co" könnte auch die Domäne sein (z. B. co.com). Sie müssen also eine Liste aller Toplevel-Domains verwenden. – morja

0

ich den „Top-Level“ bekam Domain-Namen aussehen würde, könnte es hässlich sein, aber es funktioniert.

$fix = array('com', 'edu', 'gov', 'int', 'mil', 'net', 'org', 'biz', 'info', 'pro', 'name', 'museum', 'coop', 'aero', 'x xx', 'idv', 'al', 'dz', 'af', 'ar', 'ae', 'aw', 'om', 'az', 'eg', 'et', 'ie', 'ee', 'ad', 'ao', 'ai', 'ag', 'at', 'au',  'mo', 'bb', 'pg', 'bs', 'pk', 'py', 'ps', 'bh', 'pa', 'br', 'by', 'bm', 'bg', 'mp', 'bj', 'be', 'is', 'pr', 'ba', 'pl',  'bo', 'bz', 'bw', 'bt', 'bf', 'bi', 'bv', 'kp', 'gq', 'dk', 'de', 'tl', 'tp', 'tg', 'dm', 'do', 'ru', 'ec', 'er', 'fr',  'fo', 'pf', 'gf', 'tf', 'va', 'ph', 'fj', 'fi', 'cv', 'fk', 'gm', 'cg', 'cd', 'co', 'cr', 'gg', 'gd', 'gl', 'ge', 'cu',  'gp', 'gu', 'gy', 'kz', 'ht', 'kr', 'nl', 'an', 'hm', 'hn', 'ki', 'dj', 'kg', 'gn', 'gw', 'ca', 'gh', 'ga', 'kh', 'cz',  'zw', 'cm', 'qa', 'ky', 'km', 'ci', 'kw', 'cc', 'hr', 'ke', 'ck', 'lv', 'ls', 'la', 'lb', 'lt', 'lr', 'ly', 'li', 're',  'lu', 'rw', 'ro', 'mg', 'im', 'mv', 'mt', 'mw', 'my', 'ml', 'mk', 'mh', 'mq', 'yt', 'mu', 'mr', 'us', 'um', 'as', 'vi',  'mn', 'ms', 'bd', 'pe', 'fm', 'mm', 'md', 'ma', 'mc', 'mz', 'mx', 'nr', 'np', 'ni', 'ne', 'ng', 'nu', 'no', 'nf', 'na',  'za', 'aq', 'gs', 'eu', 'pw', 'pn', 'pt', 'jp', 'se', 'ch', 'sv', 'ws', 'yu', 'sl', 'sn', 'cy', 'sc', 'sa', 'cx', 'st',  'sh', 'kn', 'lc', 'sm', 'pm', 'vc', 'lk', 'sk', 'si', 'sj', 'sz', 'sd', 'sr', 'sb', 'so', 'tj', 'tw', 'th', 'tz', 'to',  'tc', 'tt', 'tn', 'tv', 'tr', 'tm', 'tk', 'wf', 'vu', 'gt', 've', 'bn', 'ug', 'ua', 'uy', 'uz', 'es', 'eh', 'gr', 'hk',  'sg', 'nc', 'nz', 'hu', 'sy', 'jm', 'am', 'ac', 'ye', 'iq', 'ir', 'il', 'it', 'in', 'id', 'uk', 'vg', 'io', 'jo', 'vn',  'zm', 'je', 'td', 'gi', 'cl', 'cf', 'cn', 'ac', 'ad', 'ae', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', 'as',  'at', 'au', 'aw', 'az', 'ba', 'bb', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'bj', 'bm', 'bn', 'bo', 'br', 'bs', 'bt', 'bv',  'bw', 'by', 'bz', 'ca', 'cc', 'cd', 'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'cr', 'cu', 'cv', 'cx', 'cy',  'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec', 'ee', 'eg', 'eh', 'er', 'es', 'et', 'eu', 'fi', 'fj', 'fk', 'fm', 'fo',  'fr', 'ga', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi', 'gl', 'gm', 'gn', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy', 'hk',  'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jp', 'ke',  'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', 'lv',  'ly', 'ma', 'mc', 'md', 'mg', 'mh', 'mk', 'ml', 'mm', 'mn', 'mo', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'mv', 'mw', 'mx',  'my', 'mz', 'na', 'nc', 'ne', 'nf', 'ng', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'pa', 'pe', 'pf', 'pg', 'ph',  'pk', 'pl', 'pm', 'pn', 'pr', 'ps', 'pt', 'pw', 'py', 'qa', 're', 'ro', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg',  'sh', 'si', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'st', 'sv', 'sy', 'sz', 'tc', 'td', 'tf', 'tg', 'th', 'tj', 'tk',  'tl', 'tm', 'tn', 'to', 'tp', 'tr', 'tt', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've',  'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'ye', 'yt', 'yu', 'yr', 'za', 'zm', 'zw'); 

function get_domain($url){ 
    global $fix; 
    $host = parse_url($url,PHP_URL_HOST); 
    $list = explode('.',$host); 
    $res = array(); 
    $i = count($list) - 1; 
    while($i >= 0){ 
     if(!in_array($list[$i],$fix)){ 
     $res[] = $list[$i]; 
     break; 
     } 
    $res[] = $list[$i]; 
    $i--; 
    } 
    return implode('.',array_reverse($res)); 
} 
0

Sie können regex und jede interne Funktion verwenden, aber Sie werden nie richtiges Ergebnis auf komplexe Bereich Zonen (.co.uk, .a.bg, .fuso.aichi.jp, etc.) haben.

Sie benötigen eine Bibliothek, die für die korrekte Extraktion verwendet. Ich empfehle TLDExtract.

Hier ist ein Beispielcode:

$extract = new LayerShifter\TLDExtract\Extract(); 

$result = $extract->parse('mydomain.co.in'); 
$result->getSubdomain(); // will return null 
$result->getHostname(); // will return 'mydomain' 
$result->getSuffix(); // will return 'co.in' 
$result->getFullHost(); // will return 'mydomain.co.in' 
$result->getRegistrableDomain(); // will return 'mydomain.co.in' 
Verwandte Themen