输入是一个参数字符串(输入格式无法更改)
something=1,2,3,4,5&something_else=6,7,8
预期产出:
something=1,2,3,4,5&something_else=6,7,8
我在做什么:
params = 'something=1,2,3,4,5'
CGI::parse(params)
CGI.unescape(CGI.parse(params).to_query)
我将此作为输出:
something[]=1,2,3,4,5
当我做CGI::parse(params)
时
我得到了这个:{"something"=>["1,2,3,4,5"]}
这是错误的,因为它不是一个数组,某个字符串是" 1,2,3,4,5"但是当我进行CGI解析时,它被转换为数组。
我需要进行CGI解析的原因是因为我需要操作URL PARAMS。
还有其他可能的方法可以以正确的方式转换它并保持params格式吗?
答案 0 :(得分:2)
CGI模块是一个完整的恐龙,应该被抛入垃圾中,因为它有多糟糕,但由于某种原因它仍然存在于Ruby核心中。也许有一天有人会重构它并让它变得可行。在那之前,跳过它并使用更好的东西,比如URI,它也是内置的。
鉴于您的不规则,不合规的查询字符串:
query_string = 'something=1,2,3,4,5&something_else=6,7,8'
您可以使用处理查询字符串的decode_www_form
方法来处理此问题:
require 'uri'
decoded = URI.decode_www_form(query_string).to_h
# => {"something"=>"1,2,3,4,5", "something_else"=>"6,7,8"}
要重新编码,您只需致电encode_www_form
,然后强制unescape
撤消正确处理,
值的内容:
encoded = URI.unescape(URI.encode_www_form(decoded))
# => "something=1,2,3,4,5&something_else=6,7,8"
那应该得到你想要的效果。