Подтвердить что ты не робот

Как бы вы разобрали URL-адрес в Ruby, чтобы получить основной домен?

Я хочу иметь возможность анализировать любой url с ruby, чтобы получить основную часть домена без www (только XXXX.com)

4b9b3361

Ответ 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})$/]