将任何URL或路径规范化为标准路径语法

时间:2012-12-30 00:54:35

标签: ruby

我想获取一个URL或仅一个路径,并使用一致的语法删除除路径之外的所有内容,例如没有结尾斜杠等。

示例:

'/categories/cameras/'             => '/categories/cameras'
'http://domain.com/products/'      => '/products'
'products'                         => '/products'
'deals/newyears/'                  => '/deals/newyears'
'https://domain.com/'              => '/'
'https://domain.com/terms#refunds' => '/terms'
''                                 => '/'

任何想法如何制作一个方法来做到这一点?

3 个答案:

答案 0 :(得分:2)

这是一个相当具体的用例。除非你愿意自己编写,否则我无法想到任何可以用一个函数处理这个问题的东西。

通常类似"products"的内容被视为相对路径,其中"/products"是文字路径,"http://example.com/products"是绝对URI。在URI.join中,每个处理方式都有所不同。

我不确定"domain.com/products"如何被解释为"/products",除非您假设路径的第一部分不允许包含.。一个相当有吸引力的假设,但也许这将在你的用例中起作用。

以下是可能有效的摘录:

require 'uri'

def remap(path)
  uri = nil

  case (path)
  when %r<^https?://>
    uri = URI.parse(path)
  when %r<^/>
    uri = URI.parse("http://example.com#{path}")
  when %r<^[\w\-]+\.\w+/>
    uri = URI.parse("http://#{path}")
  else
    uri = URI.parse("http://example.com/#{path}")
  end

  uri and uri.path
end

我不确定为什么"/"将返回空字符串,因为所有其他字符都以斜杠为前缀。如果您愿意,可以随时添加该逻辑,但似乎不一致。

答案 1 :(得分:1)

这似乎有效:

require 'uri'

def standard_path(p)
  path = URI.parse(p).path
  path.insert(0, '/') if (path[0] != '/')
  path.chomp!('/') if (path > '/')
  path
end

[
  '/categories/cameras/',
  'http://domain.com/products/',
  'products',
  'deals/newyears/',
  'https://domain.com/',
  'https://domain.com/terms#refunds',
  '',
].each do |p|
  puts standard_path(p)
end

哪个输出:

/categories/cameras
/products
/products
/deals/newyears
/
/terms
/

答案 2 :(得分:0)

您是否尝试过使用Ruby Standard URI library

> require "uri"
 => true 
> URI.parse("/foo").path
 => "/foo" 
> URI.parse("http://google.com/foo").path
 => "/foo" 
> URI.parse("http://google.com").path
 => ""