Как бы вы проанализировали URL в Ruby, чтобы получить основной домен? - PullRequest
38 голосов
/ 13 июля 2011

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

Ответы [ 6 ]

76 голосов
/ 30 ноября 2011

Обратите внимание, нет алгоритмического метода определения наивысшего уровня, на котором домен может быть зарегистрирован для определенного домена верхнего уровня (политики различаются в зависимости от каждого реестра), единственный способ - создать список всех доменов верхнего уровня и уровень, на котором домены могут быть зарегистрированы.

Это причина, по которой существует Публичный список суффиксов .

Я являюсь автором 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"
61 голосов
/ 13 июля 2011

Это должно работать практически с любым 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'.

4 голосов
/ 30 ноября 2011

Просто короткое замечание: чтобы преодолеть второй разбор 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-адреса на основе http (s), что является широко распространенным стандартом.Но если вы будете использовать его более широко (например, для ftp-ссылок), вы должны соответственно отрегулировать.

2 голосов
/ 06 февраля 2018

Адресуемый , вероятно, правильный ответ в 2018 году, особенно использует гем PublicSuffix для анализа доменов .

Однако мне нужно выполнить такой анализ внесколько мест, из разных источников данных, и нашел его несколько многословным для многократного использования.Поэтому я создал обертку вокруг него: Adomain :

require 'adomain'

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

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

Adomain["stackoverflow.com"]
# => "stackoverflow.com"

Надеюсь, это поможет другим.

1 голос
/ 11 апреля 2016

Вот тот, который лучше работает с доменами типа .co.uk и .com.fr

domain = uri.host[/[^.\s\/]+\.([a-z]{3,}|([a-z]{2}|com)\.[a-z]{2})$/]
0 голосов
/ 13 июля 2011

, если URL имеет формат http://www.google.com, тогда вы можете сделать что-то вроде:

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

Или

a =~ /http:\/\/www\.(.*?)$/
puts $1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...