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 に答える