2012-12-30 66 views
2

我想要一個URL或只有一個路徑,並使用一致的語法去除除路徑以外的所有內容,例如沒有結尾斜槓等。將任何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' 
''         => '/' 

任何想法如何使這是否一種方法?

+2

翻譯'domain.com/products'到'/ products'造成了一些麻煩,你怎麼知道'domain.com '是域名而不是路徑名(即爲什麼它不擴展到'http:// domain.com/domain.com/products'?domain.com'是一個完全有效的路徑) –

回答

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 
/
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 
=> "" 
+0

除了URI.parse ('domain.com/products').path#=>「domain.com/products」'。 –

+0

好的。很公平。圖書館仍然爲你完成99%的工作。只是包裝它,並使用一個簡單的正則表達式或東西。 –

+0

那根本就沒有標準化,嘗試'URI.parse(「/ foo /」)'它會返回'/ foo /'而不是'/ foo',這只是一種情況。 – Ryan

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 

我不知道爲什麼"/"將返回空字符串,因爲所有的人都用斜槓前綴。如果您願意,您可以隨時添加該邏輯,但似乎不一致。

+0

+1。語法熒光筆似乎真的討厭使用「非標準」文字分隔符,儘管':P'。 –