Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中解析编码的URI?_Ruby_Url Encoding - Fatal编程技术网

如何在Ruby中解析编码的URI?

如何在Ruby中解析编码的URI?,ruby,url-encoding,Ruby,Url Encoding,我正试图解析一个URI,其中包含括号-[和]。我试图用URI.parse直接解析这个,但是括号导致这个失败。因此,我尝试用CGI::escape对URI进行编码,它会处理括号,但当我尝试用URI.parse解析这个编码的URI时,它似乎没有将其识别为URI,并将整个URI放入path对象中 在irb会议上演示 irb(main):001:0> require 'uri' => true irb(main):002:0> require 'cgi' => true irb(

我正试图解析一个URI,其中包含括号-[和]。我试图用URI.parse直接解析这个,但是括号导致这个失败。因此,我尝试用CGI::escape对URI进行编码,它会处理括号,但当我尝试用URI.parse解析这个编码的URI时,它似乎没有将其识别为URI,并将整个URI放入path对象中

在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]

使用URI.parse解析会产生所需的结果,但如果其他奇怪字符进入我的URI,则无法处理。所以我的问题是,是否有一种可靠的方法可以做到这一点而不会失败?

您可以使用
URI.encode

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

问题在于试图对整个URI应用
CGI::escape
。当您这样做时,您将丢失保存方案的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"
irb(main):015:0>encoded_name=URI.encode(名称“[]”)
=> "http://www.website.com/dir1/dir%5B2%5D/file.txt"
irb(main):016:0>parsed_name=URI.parse(encoded_name)
=> #
irb(main):017:0>解析的_name.scheme
=>“http”
irb(main):018:0>解析的_name.host
=>“www.website.com”
irb(main):019:0>解析的_name.path
=>“/dir1/dir%5B2%5D/file.txt”

要获取原始路径,只需
URI.decode
parsed\u name.path.path

中获得的任何内容,您希望从该URI中得到什么?我想将其拆分为主机名和路径名。这就解决了问题并产生了更干净的代码。
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"