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

Mar*_*ley 11 ruby regex parsing ruby-on-rails

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

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

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

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

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

Mar*_*ley 8

因此,在发布我自己的答案时,我并不是说像domainatrix或public_suffix_server这样的宝石并不是优雅的解决方案(虽然后者立即对我造成了影响,导致我走这条路).

人们建议使用split()让我意识到我可以解析'www'.如果它存在并以其他方式离开域而不安装gem并使用一行简单的代码:

url = request.original_url
domain = URI.parse(url).host.sub(/\Awww\./, '')
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你应该收紧你的正则表达式.`www.将匹配任何字符串'www`和任何其他字符.句点是一个特殊的正则表达式字符,表示任何单个字符.因此,如果您对网站http://www2009.org/进行了测试,您最终会删除"www2"并离开009.org.至少,尝试`\ Awww\.``"\ A"将强制检查只考虑字符串的开头和"\".将逃避这段时间意味着你只是在寻找那个时期的角色.如果您在使用正则表达式时遇到问题,http://www.rubular.com/是一个很好的资源. (5认同)

jma*_*zek 5

您可以使用domainatrix gem来获得所需的内容:url.domain + url.public_suffix,但是您可以执行一些字符串操作,例如uri[4..-1]