如何在不包含子域的情况下检索URL的`scheme:// domain`部分?

时间:2011-09-08 20:15:36

标签: ruby-on-rails ruby ruby-on-rails-3 url dns

我正在使用Ruby on Rails 3.0.10,我希望在不包含子域部分的情况下检索URL的scheme://domain部分。也就是说,如果我有以下网址

http://www.sub_domain.domain.com

我想检索

http://www.domain.com

我该怎么做?(我应该使用正则表达式吗?)


更新

@mu is too short在他的评论中正确地说了(这让我想到了......):

  

你误解了。 www.ac.uk是无意义的,基本领域   牛津是ox.ac.uk; ac.uk部分的意思是“学术英国”,是,   语义上,一个组件。其他几个国家也有类似的命名   方案

因此,更新问题是:

如何迭代网址(例如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 :(得分:0)

这是一个完全黑客攻击,我不知道它在一般意义上是如何有用的,但是你走了。

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" 

答案 1 :(得分:0)

如果您知道该网址以.com结尾并且遵循您指定的格式,您可以尝试这样的正则表达式:

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

解析域名和以下.com。使用http://www的前缀,您应该全部设置。

没有“一般情况”解决方案。有些网址使用带有一个点(.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]
}

注意:代码不在我的头顶,仅用于说明目的(它可能不会完全按原样运行,但你明白了)

答案 2 :(得分:0)

处理此问题的正确方法是使用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查找以获得任何合理的信息。