2016-01-15 21 views
6

Zur Zeit kann ich die ‚Domain‘ Auszug aus einer URL mit dem folgenden regulären Ausdruck:JavaScript Regex URL Extrakt Domain nur

/^(?:https?:\/\/)?(?:[^@\n][email protected])?(?:www\.)?([^:\/\n\?\=]+)/im

Allerdings bin ich auch Sub-Domain ist immer zu dem ich vermeiden will. wenn ich zum Beispiel haben Plätze:

  • www.google.com
  • yahoo.com/something
  • freds.meatmarket.co.uk?someparameter
  • josh.meatmarket.co.uk/asldf/asdf

ich zur Zeit erhalten:

  • google.com
  • yahoo.com
  • freds.meatmarket.co.uk
  • josh.meatmarket.co.uk

Die letzten beiden möchte ich die freds und josh Subdomain Teil auszuschliessen und extrahieren nur die wahre Domäne, die nur meatmarket.co.uk wäre.

Ich fand eine andere SOF, die versucht, in PHP zu lösen, leider kenne ich PHP nicht. ist das zu JS übersetzbar (ich verwende tatsächlich Google Script FYI)?

function topDomainFromURL($url) { 
    $url_parts = parse_url($url); 
    $domain_parts = explode('.', $url_parts['host']); 
    if (strlen(end($domain_parts)) == 2) { 
     // ccTLD here, get last three parts 
     $top_domain_parts = array_slice($domain_parts, -3); 
    } else { 
     $top_domain_parts = array_slice($domain_parts, -2); 
    } 
    $top_domain = implode('.', $top_domain_parts); 
    return $top_domain; 
    } 

Antwort

10

Also, Sie müssen zuerst Hostnamen von Ihrem Ergebnis entfernt, es sei denn, es gibt nur zwei Teile bereits?

nachbearbeiten einfach Ihr Ergebnis aus dem ersten Spiel mit regexp diese Bedingung erfüllen:

function domain_from_url(url) { 
    var result 
    var match 
    if (match = url.match(/^(?:https?:\/\/)?(?:[^@\n][email protected])?(?:www\.)?([^:\/\n\?\=]+)/im)) { 
     result = match[1] 
     if (match = result.match(/^[^\.]+\.(.+\..+)$/)) { 
      result = match[1] 
     } 
    } 
    return result 
} 

console.log(domain_from_url("www.google.com")) 
console.log(domain_from_url("yahoo.com/something")) 
console.log(domain_from_url("freds.meatmarket.co.uk?someparameter")) 
console.log(domain_from_url("josh.meatmarket.co.uk/asldf/asdf")) 

// google.com 
// yahoo.com 
// meatmarket.co.uk 
// meatmarket.co.uk 
+0

Das sieht so weit die beste Lösung zu sein. Ich denke, ich kann Mod, um schlechte Domains ausgeschlossen zu geben, wie "etwas/etwas/etwas" – MarkII

+0

@MarkII, yeah, Sie können so ziemlich alle anderen Checks, die Sie wollen, darüber string. Ich habe auch '^' Anker hinzugefügt, den ich vor meiner Regexp vergessen habe. –

+0

Dies funktioniert nicht für einige gültige URL-Parameter, z. "http: //freds.meatmarket.co.uk? someparameter? ordernummer = 1234 & email = break @ regex.com" die untergeordnete Gruppe ist "regex.com", weil sie auf einem @ – Davos

0

Versuchen www durch etwas zu ersetzen, sonst:

/^(?:https?:\/\/)?(?:[^@\n][email protected])?(?:[^.]+\.)?([^:\/\n\?\=]+)/im

EDIT: Wenn Sie unbedingt die www in Ihre Regex erhalten möchten, können Sie könnte dieses versuchen:

/^(?:https?:\/\/)?(?:[^@\n][email protected])?(?:www\.)?(?:[^.]+\.)?([^:\/\n\?\=]+)/im

+0

nur in der Lage waren TLD zu extrahieren (com) ... – MarkII