2009-06-11 2 views
7

Ich bin über eine Reihe von URLs Looping und möchte sie bereinigen. Ich habe den folgenden Code:Entfernen Sie Sub-Domain von String in Ruby

# Parse url to remove http, path and check format 
o_url = URI.parse(node.attributes['href']) 

# Remove www 
new_url = o_url.host.gsub('www.', '').strip 

Wie kann ich erweitern diese die Subdomains zu entfernen, die in einigen URLs existieren?

Antwort

2

Etwas wie:

def remove_subdomain(host) 
    # Not complete. Add all root domain to regexp 
    host.sub(/.*?([^.]+(\.com|\.co\.uk|\.uk|\.nl))$/, "\\1") 
end 

puts remove_subdomain("www.example.com") # -> example.com 
puts remove_subdomain("www.company.co.uk") # -> company.co.uk 
puts remove_subdomain("www.sub.domain.nl") # -> domain.nl 

Sie müssen noch alle (root) hinzufügen Domains Sie Root-Domain in Betracht ziehen. '.uk' könnte also die Stammdomäne sein, aber Sie möchten den Host wahrscheinlich kurz vor dem '.co.uk' Teil behalten.

1

Das Erkennen der Subdomain einer URL ist im allgemeinen Sinne nicht trivial - es ist einfach, wenn man nur die grundlegenden betrachtet, aber sobald man ins internationale Territorium kommt, wird es schwierig.

Bearbeiten: Betrachten Sie Zeug wie http://mylocalschool.k12.oh.us et al.

6

Dies ist ein kniffliges Problem. Einige Top-Level-Domains akzeptieren keine Registrierungen auf der zweiten Ebene.

Vergleichen Sie example.com und example.co.uk. Wenn Sie einfach alles außer den letzten beiden Domänen abzustreifen, würden Sie mit example.com und co.uk enden, was nie die Absicht sein kann.

Firefox löst dies durch Filtern nach effektive Top-Level-Domain, und sie pflegen eine Liste von all these domains. Weitere Informationen unter publicsuffix.org.

Sie können mit dieser Liste alles außer der Domäne rechts neben der effektiven TLD ausfiltern. Ich kenne keine Ruby-Bibliothek, die das tut, aber es wäre eine gute Idee, eins zu veröffentlichen!

Update: es gibt C, Perl and PHP libraries, die dies tun. Bei der C-Version könnten Sie eine Ruby-Erweiterung erstellen. Alternativ könnten Sie den Code nach Ruby portieren.

+0

Forgot über diese Website, gute Antwort –

3

Der reguläre Ausdruck, den Sie hier benötigen, kann ein bisschen schwierig sein, weil Hostnamen unendlich komplex sein können - Sie könnten mehrere Subdomains (zB. Foo.bar.baz.com) oder die Top-Level-Domain (TLD) kann mehrere Teile haben (zB www.baz.co.uk).

Bereit für einen komplexen regulären Ausdruck? :)

re = /^(?:(?>[a-z0-9-]*\.)+?|)([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$/i 
new_url = o_url.host.gsub(re, '\1').strip 

Lassen Sie uns das in zwei Abschnitte aufteilen. ^(?:(?>[a-z0-9-]*\.)+?|) sammelt Subdomains, indem eine oder mehrere Gruppen von Zeichen gefolgt von einem Punkt gefunden werden (gierig, so dass alle Subdomains hier übereinstimmen). Die leere Alternierung wird benötigt, wenn keine Subdomain vorhanden ist (z. B. foo.com). sammelt den tatsächlichen Hostnamen und die TLD. Es erlaubt entweder eine einteilige TLD (wie .info, .com oder .museum) oder eine zweiteilige TLD, bei der der zweite Teil aus zwei Zeichen besteht (wie .oh.us oder .org.uk).

Getestet habe ich diesen Ausdruck auf die folgenden Beispiele:

foo.com => foo.com 
www.foo.com => foo.com 
bar.foo.com => foo.com 
www.foo.ca => foo.ca 
www.foo.co.uk => foo.co.uk 
a.b.c.d.e.foo.com => foo.com 
a.b.c.d.e.foo.co.uk => foo.co.uk 

Beachten Sie, dass diese regex nicht richtig Host-Namen übereinstimmen, die mehr als zwei „Teile“ auf die TLD haben!

28

Ich habe gerade eine Bibliothek namens Domainatrix geschrieben. Sie können es hier finden: http://github.com/pauldix/domainatrix

require 'rubygems' 
require 'domainatrix' 

url = Domainatrix.parse("http://www.pauldix.net") 
url.public_suffix  # => "net" 
url.domain # => "pauldix" 
url.canonical # => "net.pauldix" 

url = Domainatrix.parse("http://foo.bar.pauldix.co.uk/asdf.html?q=arg") 
url.public_suffix  # => "co.uk" 
url.domain # => "pauldix" 
url.subdomain # => "foo.bar" 
url.path  # => "/asdf.html?q=arg" 
url.canonical # => "uk.co.pauldix.bar.foo/asdf.html?q=arg" 
+1

Dieser Rubin Edelstein verweist auf die Mozilla-Datei auf publicssuffix.org. – shadowbq

+0

Funktioniert besser als URI, in meiner Erfahrung, zum Beispiel in Youtube Videos URI entfernt die? V = ******** Feld verlassen nur/Watch, während Domainatrix funktioniert perfekt – alexvicegrab

4

Für die Nachwelt hier ist ein Update von Oktober 2014:

Ich war für eine mehr up-to-date Abhängigkeit der Suche vertrauen und die public_suffix Juwel gefunden (RubyGems) (GitHub). Es wird aktiv gepflegt und behandelt alle Top-Level-Domain- und Nested-Subdomain-Probleme, indem es eine Liste der bekannten öffentlichen Suffixe verwaltet.

In Kombination mit URI.parse zum Abstreifen Protokoll und Wege, es funktioniert wirklich gut:

❯❯❯ 2.1.2 ❯ PublicSuffix.parse(URI.parse('https://subdomain.google.co.uk/path/on/path').host).domain 
=> "google.co.uk" 
0

Warum nicht nur die .com-Streifen oder .co.uk und dann aufgeteilt auf ‚‘ und das letzte Element bekommen?

some_url.host.sub(/(\.co\.uk|\.[^.]*)$/).split('.')[-1] + $1 

Ich muss sagen, es fühlt sich hacky. Gibt es noch andere Domains wie .co.uk?

0

Ich habe im Laufe der Jahre immer wieder mit verschiedenen Crawlern und Scrapern darüber geschrieben. Mein Lieblingsstück, um das zu lösen, ist FuzzyUrl von Pete Gamache: https://github.com/gamache/fuzzyurl. Es ist für Ruby, JavaScript und Elixir verfügbar.

Verwandte Themen