Как получить часть URL `схема: // домен`, не включая поддоменов? - PullRequest
0 голосов
/ 09 сентября 2011

Я использую Ruby on Rails 3.0.10, и я хотел бы получить часть URL scheme://domain, не включая часть субдомена.То есть, если у меня есть следующий URL

http://www.sub_domain.domain.com

, я хочу получить

http://www.domain.com

Как я могу это сделать (следует ли использовать регулярное выражение?) ?


ОБНОВЛЕНИЕ

@mu is too short правильно сказал в своем комментарии (что заставило меня задуматься ...):

Вы неправильно поняли.www.ac.uk не имеет смысла, основной домен для Оксфорда - ox.ac.uk;часть ac.uk означает «академическая Великобритания» и является семантически одним компонентом.В некоторых других странах аналогичные схемы именования.

Итак, вопрос об обновлении:

Как я могу перебрать URL (например, http://www.maths.ox.ac.uk/) как сделано в следующих шагах , чтобы удалить постепенно частей поддоменов до последней?

http://www.maths.ox.ac.uk/ # Step 0 (start)
http://www.ox.ac.uk/       # Step 1
http://www.ac.uk/          # Step 2 (end)

Ответы [ 3 ]

0 голосов
/ 09 сентября 2011

Если вы знаете , что URL оканчивается на .com и соответствует указанному вами формату, вы можете использовать регулярное выражение, например:

\.[\w\-]+\.com

для разбора домена и последующего .com. Поставьте префикс http://www, и все будет готово.

Для этого не существует решения "общего случая". Некоторые URL-адреса используют суффикс с одной точкой (.com или .edu), в то время как некоторые используют несколько точек (.co.jp и т. Д.). Вы не сможете решить это с помощью чего-то такого простого, как регулярное выражение.

Что вы можете сделать, это составить список возможных суффиксов URL и создать регулярное выражение для каждого из них. Если она соответствует вашей входной строке, используйте вариант из приведенного выше:

base_regex = '\.[\w\-]+'
list_of_suffixes.each {|s|
    thisregex = Regexp.new(base_regex + s)
    match = thisregex.match(url)
    next if match == nil
    return 'http://www.' + match[0]
}

Примечание: код не в моей голове и только для иллюстрации (вероятно, он не будет работать так, как есть, но вы поняли)

0 голосов
/ 09 сентября 2011

Правильный способ справиться с этим - использовать URI:

# Parse and remove all the stuff you don't want.
u = URI.parse('http://www.sub-domain.domain.com/pancakes')
u.userinfo = nil
u.path     = ''
u.fragment = nil
# You might want to check u.scheme as well

host = u.host

И теперь вы должны выяснить, что вы хотите сделать с host. Вы можете начать с последнего компонента и работать в обратном направлении, пока не получите доменное имя, которое разрешается с помощью Net :: DNS :

require 'net/dns/resolver'
components = host.split('.')
basename   = (1 .. components.length).
             map  { |i| components.last(i + 1).join('.') }.
             find { |n| Resolver(n).answer.length > 0    }

# basename is now nil or something with a DNS A record
if(basename.nil?)
    # complain and bail out
end
u.host = basename
# Your trimmed URL is in u.to_s

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

Это по-прежнему не гарантирует, что у вас есть полезный URL, вам нужно проверить, чтобы убедиться, что имя, которое вы в итоге получите, отвечает на HTTP-запрос, чтобы быть уверенным.


Чтобы ответить на ваш оригинальный вопрос:

я должен использовать регулярное выражение?

Абсолютно нет. URL-адреса намного сложнее, чем думает большинство людей, поэтому вам следует использовать настоящий анализатор URL-адресов, например URI. Кроме того, доменные имена также более сложны, чем думает большинство людей, поэтому вам нужно прибегнуть к поиску DNS, чтобы получить что-нибудь разумное.

0 голосов
/ 09 сентября 2011

Это полный взлом, и я понятия не имею, как он может быть полезен в общем смысле, но вот, пожалуйста.

ruby-1.8.7-p352 >   uri = URI.parse("http://www.foo.domain.com/")
 => #<URI::HTTP:0x105011840 URL:http://www.foo.domain.com/> 
ruby-1.8.7-p352 > uri.scheme + "://" + uri.host.split(/\./)[-2..-1].join(".")
 => "http://domain.com" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...