gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:19:23 25 4
gpt4 key购买 nike

我正在尝试解析其中包含方括号 - [ 和 ] - 的 URI。我试图用 URI.parse 直接解析它,但括号导致失败。因此,我尝试使用 CGI::escape 对 URI 进行编码,它负责处理括号,但是当我尝试使用 URI.parse 解析此编码的 URI 时,它似乎无法将其识别为 URI 并将整个 URI 放入路径中对象。

在 irb session 中演示;

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]

无论如何,我目前的工作是以下丑陋但有效的 hack

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

使用 URI.parse 解析它会产生所需的结果,但如果其他奇怪的字符进入我的 URI,则无法处理。所以我的问题是,有没有一种不会折叠的可靠方法?

最佳答案

问题在于尝试将 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 获得什么。

关于ruby - 如何在 Ruby 中解析编码的 URI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1782663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com