我正在使用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)
答案 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查找以获得任何合理的信息。