【问题标题】:Ruby: Normalize URL by parsingRuby:通过解析规范化 URL
【发布时间】:2019-07-12 18:29:26
【问题描述】:

我的目标是转换以下任何一种:

到:

  • www.google.com

我做了以下事情:

def parse_url(url)

    uri = URI.parse(url)

    return uri.host if uri.scheme
    return uri.to_s if uri.to_s[0, 4] == 'www.'

    "www.#{url}"
end

但我觉得可能有一些更标准的东西我可以使用,因为它看起来不那么优雅。

【问题讨论】:

  • 请注意,并非所有网站都能感知 www。
  • 我建议在代码执行您想要的操作后担心优化。 parse_url('http://google.com') # => "google.com"
  • www. 实际上是一个子域 - 它不是协议的一部分。尽管将http://example.com 重定向到http://www.example.com 是一种非常普遍的做法,反之亦然,但仍有许多服务器不这样做,并且此代码会中断。您应该更多地担心这是否真的是一个好主意,而不是优化。

标签: ruby parsing url uri


【解决方案1】:

始终确保代码首先执行您想要的操作。如果稍后有代码异味,请考虑不同的方法来做你想做的事,然后选择最容易理解的方法。

简洁的代码不一定是最优雅的,当其他人不得不找出问题所在并且不理解导致无法破译逻辑的精妙之处时,通常很难理解哪些会导致稍后引入错误。

你的代码没有做你想做的事:

parse_url('http://google.com') # => "google.com"

这是我要写的快速而肮脏的第一遍:

require 'uri'

def parse_url(url)

    uri = URI.parse(url)

    # if it's not a generic URI...
    if uri.scheme

      # peek at the host
      url_host = uri.host

      # if it starts with "www." then return it as is...
      if url_host[0,4] == 'www.'
        return url_host

      # else add the prefix and return it
      else
        return 'www.' + uri.host
      end

    # if it's a generic...
    else
      if url[0,4] == 'www.'
        return url
      else
        return 'www.' + url
      end
    end

end

parse_url('http://www.google.com') # => "www.google.com"
parse_url('www.google.com') # => "www.google.com"
parse_url('http://google.com') # => "www.google.com"
parse_url('google.com') # => "www.google.com"

我确信我可以编写出更紧凑的代码,但我担心的是同行,或者我未来的自己,在凌晨进行调试,试图找出问题所在。为了对那个人友善,我宁愿保持简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2015-06-09
    • 2014-04-03
    相关资源
    最近更新 更多