7

一連の URL をループしており、それらをクリーンアップしたいと考えています。次のコードがあります。

# 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

これを拡張して、一部の URL に存在するサブドメインを削除するにはどうすればよいですか?

4

8 に答える 8

30

これを行うための Domainatrix というライブラリを作成しました。ここで見つけることができます: 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"
于 2009-12-11T21:05:54.680 に答える
7

これは難しい問題です。トップレベル ドメインの中には、第 2 レベルでの登録を受け付けないものがあります。

とを比較example.comしてくださいexample.co.uk。最後の 2 つのドメインを除いて単純にすべてを削除するとexample.com、 、 、およびが生成されますがco.uk、これは決して意図したものではありません。

Firefox は有効なトップレベル ドメインでフィルタリングすることでこれを解決し、これらすべてのドメインのリストを維持しています。詳しくはpublicsuffix.orgをご覧ください。

このリストを使用して、有効な TLD のすぐ隣のドメインを除くすべてを除外できます。これを行う Ruby ライブラリは知りませんが、リリースするのは素晴らしいアイデアです!

更新: これを行うC、Perl、および PHP ライブラリがあります。C バージョンがあれば、Ruby 拡張機能を作成できます。あるいは、コードを Ruby に移植することもできます。

于 2009-06-11T19:46:48.893 に答える
3

ここで必要となる正規表現は、ホスト名が無限に複雑になる可能性があるため、少しトリッキーになる可能性があります。複数の部分 (つまり、www.baz.co.uk)。

複雑な正規表現の準備はできましたか? :)

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

これを 2 つのセクションに分けましょう。^(?:(?>[a-z0-9-]*\.)+?|)1 つまたは複数の文字グループにドットを続けて一致させることにより、サブドメインを収集します (すべてのサブドメインがここで一致するように貪欲に)。サブドメイン (foo.com など) がない場合は、空の代替が必要です。([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$実際のホスト名と TLD を収集します。1 部構成の TLD (.info、.com、.museum など)、または 2 部構成の TLD (2 番目の部分が 2 文字 (.oh.us、.org.uk など)) のいずれかを使用できます。

この式を次のサンプルでテストしました。

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

この正規表現は、2 つ以上の「部分」を持つホスト名を TLD に適切に一致させないことに注意してください。

于 2009-06-11T20:46:10.793 に答える
2

何かのようなもの:

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

ルート ドメインと見なすすべての (ルート) ドメインを追加する必要があります。したがって、'.uk' がルート ドメインになる可能性がありますが、'.co.uk' 部分の直前にホストを保持することをお勧めします。

于 2009-06-11T19:43:32.363 に答える
1

URL のサブドメインを検出することは、一般的な意味で簡単なことではありません。基本的なものだけを考えれば簡単ですが、国際的な領域に入ると、これは難しくなります。

編集:http://mylocalschool.k12.oh.usなどのようなものを検討してください

于 2009-06-11T19:45:27.647 に答える
0

.com や .co.uk を削除して、'.' で分割しないのはなぜですか。最後の要素を取得しますか?

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

ハッキーだと言わざるを得ません。.co.uk のような他のドメインはありますか?

于 2014-11-20T15:37:24.560 に答える