解析URL以提取域的最佳方式是什么?

问题描述:

可能重复:
Ruby code to extract host from URL string解析URL以提取域的最佳方式是什么?

我发现这个模块调用URI可以解析URL。 (我对ruby很新,在这种情况下'module'是否与'library'同义?)然后你可以提取主机名。

uri = URI.parse("http://www.ruby-lang.org/") 
... 
p uri.host 
# => "www.ruby-lang.org" 

从这个,我想你可以删除'www。'并使用正则表达式保留其他子域。

有没有人有更直接的选择,或者这种方法看起来是对的吗?

+0

当然,ruby必须具有某种'split()'功能。那么你为什么不把这个字符串拆分成'www.'',然后保留部分呢? – Anders 2011-02-27 13:08:21

+0

你究竟想要什么?只需从'uri.host'中删除'www'? – 2011-02-27 13:25:17

+0

库通常是一个独立的代码资源,可以包含一个或多个模块或类。 ''URI'是Ruby核心库中的一个模块,这意味着它可以在你运行的任何ruby代码中使用。对于所有其他代码,您必须将其明确加载到您的应用程序中 – Gareth 2011-02-27 13:32:53

你可以使用domainatrix gem来得到你想要的:url.domain + url.public_suffix,但你可以做一些字符串操作,如uri[4..-1]

+0

这颗宝石很不错。我想我可以显示子域名!'='www''。 – 2011-02-27 22:21:31

因此,当发布我自己的答案时,我并不是说像domainatrix或public_suffix_server这样的宝石不是优雅的解决方案(尽管后者立即窃听我,导致我走这条路)。

建议使用split()的人让我意识到我可以将“www”分出来。如果它存在否则离开域,因为它们无需安装宝石和使用的代码1个简单行:

url = request.original_url 
domain = URI.parse(url).host.sub(/\Awww\./, '') 

这适用于子域和多部分后缀(如co.uk)。有人看到有什么不对吗?

编辑:感谢sorens指出我正在使用的弱正则表达式。这个表达肯定更好。

+4

你应该收紧你的正则表达式。 'www.''要匹配任何是'www'和任何其他字符的字符串。该时期是一个特殊的正则表达式字符,意味着任何单个字符。所以如果你在网站http://www2009.org/上进行测试,你最终会删除“www2”,并留下009.org。至少,请尝试'\ Awww \',“\ A”将强制检查仅在字符串开头和“\”处考虑它。将会摆脱这个时期,意味着你只是在寻找时期的角色。如果您在使用正则表达式时遇到问题,那么http://www.rubular.com/是一个很好的帮助。 – sorens 2011-02-28 00:35:43