web-dev-qa-db-ja.com

メインドメインを取得するには、RubyのURLをどのように解析しますか?

Rubyでurlを解析して、www(XXXX.comのみ)なしでドメインの主要部分を取得できるようにしたい)

38
Justin Meltzer

これは、ほとんどすべてのURLで機能するはずです。

# URL always gets parsed twice
def get_Host_without_www(url)
  url = "http://#{url}" if URI.parse(url).scheme.nil?
  Host = URI.parse(url).Host.downcase
  Host.start_with?('www.') ? Host[4..-1] : Host
end

または:

# Only parses twice if url doesn't start with a scheme
def get_Host_without_www(url)
  uri = URI.parse(url)
  uri = URI.parse("http://#{url}") if uri.scheme.nil?
  Host = uri.Host.downcase
  Host.start_with?('www.') ? Host[4..-1] : Host
end

require 'uri'

62
Mischa

特定のトップレベルドメインにドメインを登録できる最高レベルを見つけるアルゴリズム的な方法はありません(ポリシーはそれぞれ異なりますレジストリ)、唯一の方法は、すべてのトップレベルドメインとドメインを登録できるレベルのリストを作成することです。

これが Public Suffix List が存在する理由です。

私は PublicSuffix 、a Rubyドメインを異なる部分に分解するライブラリの著者です。

ここに例があります

require 'uri/http'

uri = URI.parse("http://toolbar.google.com")
domain = PublicSuffix.parse(uri.Host)
# => "toolbar.google.com"
domain.domain
# => "google.com"

uri = URI.parse("http://www.google.co.uk")
domain = PublicSuffix.parse(uri.Host)
# => "www.google.co.uk"
domain.domain
# => "google.co.uk"
76
Simone Carletti

ちょっとした注意:Mischasの2番目の例からのURLの2番目の解析を克服するために、URI.parseの代わりに文字列比較を行うことができます。

# Only parses once
def get_Host_without_www(url)
  url = "http://#{url}" unless url.start_with?('http')
  uri = URI.parse(url)
  Host = uri.Host.downcase
  Host.start_with?('www.') ? Host[4..-1] : Host
end

このアプローチの欠点は、URLをhttp(s)ベースのURLに制限していることです。これは広く標準です。しかし、より一般的に使用する場合(たとえば、ftpリンクの場合)、それに応じて調整する必要があります。

4
nlsrchtr

アドレス可能 は、おそらく2018年にはおそらく正しい答えです- PublicSuffix gemを使用してドメインを解析する

ただし、さまざまなデータソースから複数の場所でこの種の解析を行う必要があり、繰り返し使用するのは少し冗長です。そこで、その周りにラッパーを作成しました Adomain

require 'adomain'

Adomain["https://toolbar.google.com"]
# => "toolbar.google.com"

Adomain["https://www.google.com"]
# => "google.com"

Adomain["stackoverflow.com"]
# => "stackoverflow.com"

これが他の人の役に立つことを願っています。

2
Sam

これは、.co.ukおよび.com.frタイプのドメインでより適切に機能するものです。

domain = uri.Host[/[^.\s\/]+\.([a-z]{3,}|([a-z]{2}|com)\.[a-z]{2})$/]
1
pguardiario

uRLの形式がhttp://www.google.comの場合、次のようなことができます。

a = 'http://www.google.com'
puts a.split(/\./)[1] + '.' + a.split(/\./)[2]

または

a =~ /http:\/\/www\.(.*?)$/
puts $1
0