it-swarm.com.ru

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

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

36
Justin Meltzer

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

60
Mischa

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

Это причина, по которой 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"
75
Simone Carletti

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

4
nlsrchtr

Адресуемый , вероятно, правильный ответ в 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"

Я надеюсь, что это помогает другим.

2
Sam

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

domain = uri.Host[/[^.\s\/]+\.([a-z]{3,}|([a-z]{2}|com)\.[a-z]{2})$/]
1
pguardiario

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

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

Или же

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