2

我想获取一个 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'
''                                 => '/'

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

4

3 回答 3

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

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

于 2012-12-30T01:06:18.503 回答
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
/
于 2012-12-30T04:02:13.343 回答
0

您是否尝试过仅使用Ruby 标准 URI 库

> require "uri"
 => true 
> URI.parse("/foo").path
 => "/foo" 
> URI.parse("http://google.com/foo").path
 => "/foo" 
> URI.parse("http://google.com").path
 => "" 
于 2012-12-30T01:01:27.297 回答