你如何解析Ruby中的url以获得主域名?

Jus*_*zer 38 ruby dns url parsing ruby-on-rails

我希望能够解析任何带有ruby的url来获取域的主要部分而不是www(只是XXXX.com)

Sim*_*tti 76

请注意,没有算法方法可以找到可以为特定顶级域注册域的最高级别(策略因每个注册表而异),唯一的方法是创建所有顶级域的列表和域名可以注册的级别.

这就是公共后缀列表存在的原因.

我是PublicSuffix的作者,这是一个将域分解为不同部分的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"
Run Code Online (Sandbox Code Playgroud)

  • @SimoneCarletti我原来的评论不久之前,但我的意思是在最后一个例子中`.co.uk`,突然变成了`.com`. (3认同)
  • 最后一个`domain.domain#=>"google.com"是一个错误还是我不理解某些事情? (2认同)

Mis*_*cha 62

这应该适用于几乎任何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
Run Code Online (Sandbox Code Playgroud)

要么:

# 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
Run Code Online (Sandbox Code Playgroud)

你可能不得不这样做require 'uri'.

  • 我认为这些太复杂了.这应该工作:`URI('http://www.example.com').host.match(/ [^ \.] + \.\ w + $ /).to_s`. (10认同)
  • 你可以通过在'u = URI.parse(url)`之后检查`u.scheme`然后在必要时添加一个方案并重新分析来解决这个问题. (2认同)
  • @Chip 嘿,你的正则表达式无法检查 `ccTLD` 如果 `URI('http://www.example.co.kr').host.match(/[^\.]+\.\w+$/)。 to_s` 编码,然后输出 `=> "co.kr"` (2认同)