Правильный способ справиться с этим - использовать 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, чтобы получить что-нибудь разумное.