Rubyでurlを解析して、www
(XXXX.comのみ)なしでドメインの主要部分を取得できるようにしたい)
これは、ほとんどすべての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'
。
特定のトップレベルドメインにドメインを登録できる最高レベルを見つけるアルゴリズム的な方法はありません(ポリシーはそれぞれ異なりますレジストリ)、唯一の方法は、すべてのトップレベルドメインとドメインを登録できるレベルのリストを作成することです。
これが 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"
ちょっとした注意: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リンクの場合)、それに応じて調整する必要があります。
アドレス可能 は、おそらく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"
これが他の人の役に立つことを願っています。
これは、.co.ukおよび.com.frタイプのドメインでより適切に機能するものです。
domain = uri.Host[/[^.\s\/]+\.([a-z]{3,}|([a-z]{2}|com)\.[a-z]{2})$/]
uRLの形式がhttp://www.google.com
の場合、次のようなことができます。
a = 'http://www.google.com'
puts a.split(/\./)[1] + '.' + a.split(/\./)[2]
または
a =~ /http:\/\/www\.(.*?)$/
puts $1