【问题标题】:What's the best way to parse URLs to extract the domain? [duplicate]解析 URL 以提取域的最佳方法是什么? [复制]
【发布时间】:2011-02-27 12:52:53
【问题描述】:

可能重复:
Ruby code to extract host from URL string

我发现这个模块叫做URI,它可以解析url。 (我对 ruby​​ 很陌生。在这种情况下,“模块”是否与“库”同义?)然后您可以提取主机名。

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

据此,我想您可以删除“www”。并使用正则表达式保留其他子域。

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

【问题讨论】:

  • 当然,ruby 必须具有某种split() 功能。那么为什么不直接拆分www. 上的字符串并保留后面的部分呢?
  • 你到底想要什么?只需从uri.host 中删除“www”?
  • 库通常是一个独立的代码资源,可以包含一个、更多或更少的模块或类。 URI 是 Ruby 核心库中的一个模块,这意味着它可以在您运行的任何 ruby​​ 代码中使用。对于所有其他代码,您必须将其显式加载到您的应用中
  • 使用 split('www.') 会起作用,除了如果主机是 www.example.com 它会给我一个数组,如果它是 example.com 则给我一个字符串,所以我有使用条件。看来我无论如何都得这么做。我只是想有一种更有效的方法。
  • 当然有 sub() 方法可以删除 'www.'如果找到它...在下面回答。

标签: ruby-on-rails ruby regex parsing


【解决方案1】:

因此,在发布我自己的答案时,我并不是说 domainatrix 或 public_suffix_server 之类的宝石不是很好的优雅解决方案(尽管后者立即引起了我的注意,导致我走这条路)。

建议使用 split() 的人让我意识到我可以直接删除“www”。如果它存在,则在不安装 gems 和使用 1 行简单代码的情况下保留域:

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

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

编辑:感谢 sorens 指出我最初使用的弱正则表达式。这种表达方式当然更好。

【讨论】:

  • 你应该收紧你的正则表达式。 www. 将匹配 www 和任何其他字符的任何字符串。句点是一个特殊的正则表达式字符,表示任何单个字符。因此,如果您对站点 www2009.org 进行测试,您最终会删除“www2”并留下 009.org。至少,尝试\Awww\. "\A" 将强制检查仅在字符串的开头和 "\" 处考虑它。将转义句点,表示您只在寻找句点字符。如果您在使用正则表达式时遇到问题,rubular.com 是一个很好的帮助资源。
【解决方案2】:

您可以使用domainatrix gem 来获得您想要的:url.domain + url.public_suffix,但您可以只进行一些字符串操作,例如uri[4..-1]

【讨论】:

  • 这颗宝石不错。我想我可以显示!= 'www' 的子域。
猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2019-09-24
  • 2010-09-14
  • 2012-10-07
  • 2010-09-16
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多