2

括弧 [ と ] を含む URI を解析しようとしています。これを URI.parse で直接解析しようとしましたが、括弧が原因で失敗します。したがって、括弧を処理する CGI::escape で URI をエンコードしようとしましたが、このエンコードされた URI を URI.parse で解析しようとすると、URI として認識されず、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 に侵入した場合は対処できません。だから私の質問は、これを行う確実な方法はありますか?

4

2 に答える 2

6

問題は、CGI::escapeURI 全体に適用しようとすることにあります。これを行うと、スキームを保持する 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.decodeparsed_name.path.

于 2009-11-23T15:09:03.330 に答える
3

使用できますURI.encode

encoded_name = URI.encode(name, '[]')
于 2009-11-23T14:12:55.473 に答える