问题 解析URL以提取域名的最佳方法是什么? [重复]


可能重复:
Ruby代码从URL字符串中提取主机 

我发现这个模块叫做 URI 这可以解析网址。 (我对ruby很新。在这种情况下,'module'是'library'的同义词吗?)然后你可以提取主机名。

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

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

有没有人有更直接的选择,或者这种方法是否正确?


10907
2018-02-27 12:52


起源

当然红宝石必须有某种 split() 功能。那你为什么不把字符串分开呢? www. 然后保留部分? - Anders
你到底想要什么?只需删除“www”即可 uri.host? - Vasiliy Ermolovich
库通常是自包含的代码资源,其可以包括一个,多个或更少的模块或类。 URI 是一个Ruby核心库中的模块,这意味着它可以在您运行的任何ruby代码中使用。对于所有其他代码,您必须将其明确加载到您的应用程序中 - Gareth
使用split('www。')可以工作,除了如果主机是www.example.com它会给我一个数组,如果它是example.com则会给我一个字符串所以我必须使用条件。看起来我无论如何都要做那件事。我只是觉得有一种更有效的方法。 - Marc Ripley
当然有sub()方法可以删除'www。'如果它找到了...答案如下。 - Marc Ripley


答案:


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


4
2018-02-27 13:25



这个宝石很不错。我想我可以显示那些子域名 != 'www'。 - Marc Ripley


因此,在发布我自己的答案时,我并不是说像domainatrix或public_suffix_server这样的宝石并不是优雅的解决方案(虽然后者立刻给我带来了麻烦,导致我走这条路)。

人们建议使用split()让我意识到我可以放弃'www。'如果它存在并以其他方式保留域而不安装gem并使用1个简单的代码行:

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

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

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


7
2018-02-28 00:27



你应该收紧你的正则表达式。 www. 将匹配任何字符串 www 和任何其他角色。句点是一个特殊的正则表达式字符,表示任何单个字符。所以如果你是对网站进行测试的话 www2009.org,你最终会删除“www2”并离开009.org。至少,试试吧 \Awww\. “\ A”将强制检查仅在字符串的开头和“\”处考虑它。将逃避这段时间意味着你只是在寻找那个时期的角色。如果你有正则表达式的麻烦, rubular.com 是一个很好的资源来帮助。 - sorens