首页 > 解决方案 > Ruby:通过解析规范化 URL

问题描述

我的目标是转换其中任何一个:

至:

我做了以下事情:

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

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

标签: rubyparsingurluri

解决方案


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

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

您的代码不符合您的要求:

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"

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


推荐阅读