2009-11-23 53 views
2

我試圖解析一個URI中有括號 - [和] - 在其中。我試圖用URI.parse直接解析這個,但括號會導致失敗。因此,我嘗試使用CGI :: escape編碼URI來處理括號,但是當我嘗試使用URI.parse解析這個編碼的URI時,它似乎無法將其識別爲URI並將整個URI放入路徑中目的。如何解析Ruby中的編碼URI?

在irb會話中演示;

irb(main):001:0> require 'uri' 
=> true 
irb(main):002:0> require 'cgi' 
=> true 
irb(main):003:0> name = "http://www.website.com/dir1/dir[2]/file.txt" 
=> "http://www.website.com/dir1/dir[2]/file.txt" 
irb(main):004:0> encoded_name = CGI::escape(name) 
=> "http%3A%2F%2Fwww.website.com%2Fdir1%2Fdir%5B2%5D%2Ffile.txt" 
irb(main):005:0> parsed_name = URI.parse(encoded_name) 
=> #<URI::Generic:0x00000001e8f520 URL:http%3A%2F%2Fwww.website.com%2Fdir1%2Fdir%5B2%5D%2Ffile.txt> 
irb(main):006:0> parsed_name.scheme 
=> nil 
irb(main):007:0> parsed_name.host 
=> nil 
irb(main):008:0> parsed_name.path 
=> "http%3A%2F%2Fwww.website.com%2Fdir1%2Fdir%5B2%5D%2Ffile.txt" 
irb(main):009:0> URI.split(encoded_name) 
=> [nil, nil, nil, nil, nil, "http%3A%2F%2Fwww.website.com%2Fdir1%2Fdir%5B2%5D%2Ffile.txt", nil, nil, nil] 

不管怎樣,我的工作圍繞此刻以下難看,但有效的,黑客

encoded_name = name.gsub(/\[/,"%5B").gsub(/\]/,"%5D") 

與URI.parse解析這將產生期望的結果,但如果其他奇怪的字符將不迭找到他們的方式到我的URI。所以我的問題是,是否有堅實的方法來做到這一點不會倒下?

+1

你想從那個URI準確得到什麼? – khelll 2009-11-23 11:58:17

+0

我想將它分成主機名和路徑名。 – brad 2009-11-23 22:17:50

回答

5

問題在於嘗試應用CGI::escape整個URI。當你這樣做時,你丟失了保存該方案的URI的前面部分,並且URI解析器在此之後丟失。您可能希望根據mtyaka的回答試一下:

irb(main):015:0> encoded_name = URI.encode(name, '[]') 
=> "http://www.website.com/dir1/dir%5B2%5D/file.txt" 
irb(main):016:0> parsed_name = URI.parse(encoded_name) 
=> #<URI::HTTP:0xb76ff358 URL:http://www.website.com/dir1/dir%5B2%5D/file.txt> 
irb(main):017:0> parsed_name.scheme 
=> "http" 
irb(main):018:0> parsed_name.host 
=> "www.website.com" 
irb(main):019:0> parsed_name.path 
=> "/dir1/dir%5B2%5D/file.txt" 

要獲得原始的路徑,只是URI.decode無論你從parsed_name.path得到。

+0

美麗。這解決了這個問題,併產生更清潔的代碼。 – brad 2009-11-23 22:26:52

3

你可以使用URI.encode

encoded_name = URI.encode(name, '[]')