Ruby on rails 如何在Ruby中解析url以获取主域?

Ruby on rails 如何在Ruby中解析url以获取主域?,ruby-on-rails,ruby,parsing,url,dns,Ruby On Rails,Ruby,Parsing,Url,Dns,我希望能够用ruby解析任何url,以获得域的主要部分,而不必使用www(仅限于XXXX.com)如果url的格式为http://www.google.com,然后您可以执行以下操作: a = 'http://www.google.com' puts a.split(/\./)[1] + '.' + a.split(/\./)[2] 或 这几乎适用于任何URL: # URL always gets parsed twice def get_host_without_www(url) url

我希望能够用ruby解析任何url,以获得域的主要部分,而不必使用
www
(仅限于XXXX.com)

如果url的格式为
http://www.google.com
,然后您可以执行以下操作:

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


这几乎适用于任何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
或:


您可能必须
要求使用“uri”

请注意:为了克服第二个示例中对url的第二次解析,您可以进行字符串比较,而不是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链接),您必须进行相应的调整。

请注意没有算法方法可以找到某个特定顶级域的最高注册级别(每个注册表的策略不同),唯一的方法是创建所有顶级域以及可以注册域的级别的列表

这就是为什么存在的原因

我是一个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"

这里有一个更适合.co.uk和.com.fr类型的域

domain = uri.host[/[^.\s\/]+\.([a-z]{3,}|([a-z]{2}|com)\.[a-z]{2})$/]
这可能是2018年的正确答案,尤其是

然而,我需要在多个地方,从不同的数据源进行这种解析,并且发现重复使用有点冗长。所以我在它周围做了一个包装


我希望这对其他人有帮助。

您可以编写以下方法:

require 'URI'
def domain_name(url, arg={:with_dot_principal=>false})
  arg[:with_dot_principal] ? URI(url).hostname.split('.').last(2).join('.') : URI(url).hostname.split('.').last(2).first
end
并使用:

domain_name("https://www.google.com/?gws_rd=ssl&safe=active&ssui=on")
# => "google"
domain_name("http://google.com", with_dot_principal: true)
# => "google.com"

绝对不是-这取决于你的输入-你一次只接收一个url作为输入吗?URL是否有相对路径?它们是否总是将
www
作为子域提供?他们总是有子域吗?它们都是
http
url还是您通过
https
ftp
等方式获取url?还有更多的问题可以问-这只是让你开始:)这对英国域名不起作用例如,如果
url
只是
www.example.com
,这可能不起作用,URI对没有方案的URI反应不好。你可以在
u=URI.parse(url)
之后立即检查
u.scheme
,然后在必要时添加方案并重新分析。我认为这太复杂了。这应该有效:
URI('http://www.example.com“).host.match(/[^\.]+\.\w+$/)。到
@Chip嘿,你的正则表达式不能检查
ccTLD
If
URI(“)http://www.example.co.kr“).host.match(/[^\.]+\.\w+$/)。将其编码,然后输出
=>“co.kr”
,作为最后一个
domain.domain#=>“google.com”
是一个错误还是我不明白?不,这不是一个错误。第一个
域是变量,第二个是方法调用。变量可以随意调用。“这就是为什么公共后缀列表存在的原因…”-我不相信“main”域和PSL中的一个条目是一样的。PSL包括用于cookie的GTLD、CCTLD和路径。确定“主”域不需要cookie路径,这可能会导致错误的结果。@SimoneCarletti我的原始注释是不久前的,但我的意思是在上一个示例中
.co.uk
,突然变成
.com
。我将
域.domain
重命名为
域.name
Ruby在匹配终端实体服务器证书时,在所有情况下都无法正确处理主机名匹配。我知道一些意外和无意义的结果。此结果返回nil:
require 'adomain'

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

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

Adomain["stackoverflow.com"]
# => "stackoverflow.com"
require 'URI'
def domain_name(url, arg={:with_dot_principal=>false})
  arg[:with_dot_principal] ? URI(url).hostname.split('.').last(2).join('.') : URI(url).hostname.split('.').last(2).first
end
domain_name("https://www.google.com/?gws_rd=ssl&safe=active&ssui=on")
# => "google"
domain_name("http://google.com", with_dot_principal: true)
# => "google.com"