你如何parsing一个在Ruby中的URL来获得主域名?

我想能够parsing任何url与ruby获得域的主要部分没有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'

请注意,没有一种algorithm可以find特定顶级域的注册域的最高级别 (每个registry的策略不同),唯一的方法是创build所有顶级域的列表,可以注册域名的级别。

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

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

简单的说一下:为了克服Mischas第二个例子中对url的第二个parsing,你可以做一个string比较而不是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链接),你必须相应地调整。

如果url的格式是http://www.google.com ,那么您可以执行以下操作:

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

要么

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

这是一个更好的与.co.uk和.com.frtypes的域名

 domain = uri.host[/[^.\s\/]+\.([az]{3,}|([az]{2}|com)\.[az]{2})$/]