Я хочу иметь возможность анализировать любой url с ruby, чтобы получить основную часть домена без www
(только XXXX.com)
Как бы вы разобрали URL-адрес в Ruby, чтобы получить основной домен?
Ответ 1
Это должно работать с почти любым 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'
.
Ответ 2
Обратите внимание: не существует алгоритмического метода поиска наивысшего уровня, на котором домен может быть зарегистрирован для определенного домена верхнего уровня (политики различаются в каждом реестре), единственный способ - создать список всех доменов верхнего уровня и уровень регистрации доменов.
Вот почему существует Public Suffix List.
Я являюсь автором 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"
Ответ 3
Просто короткая заметка: чтобы преодолеть второй синтаксический анализ URL из второго примера Mischas, вы можете сделать сравнение строк вместо 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-адреса URL-адресами, которые широко распространены. Но если вы будете использовать его более общий (например, для ftp-ссылок), вы должны соответствующим образом настроить.
Ответ 4
если URL-адрес находится в формате http://www.google.com
, вы можете сделать что-то вроде:
a = 'http://www.google.com'
puts a.split(/\./)[1] + '.' + a.split(/\./)[2]
или
a =~ /http:\/\/www\.(.*?)$/
puts $1
Ответ 5
Здесь тот, который лучше работает с доменами .co.uk и .com.fr -
domain = uri.host[/[^.\s\/]+\.([a-z]{3,}|([a-z]{2}|com)\.[a-z]{2})$/]