我想获取一个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'
'' => '/'
任何想法如何制作一个方法来做到这一点?
答案 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
=> ""