在ruby中解析
我有这个Hash
:
cookie = {"fbs_138415639544444"=>["\"access_token=138415639544444|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt&expires=0 &secret=64aa8b3327eafbfd22ba070b&session_key=5c682220fa7dsfdsafas3523340 &sig=4a494b851ff43d3a58dfa8757b702dfe&uid=503523340\""], "_play_session"=>["fdasdfasdf"]}
我需要在access_token=
之前&expires
之后才能获得子串。 问题是密钥fbs_138415639544444
中的数字每次fbs_138415639544444
改变,只是部分fbs_
保持不变。
知道如何获得:
"138415639544444|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt"
在HTML URL中解码参数和查询时,这是一项常见任务。 这是将参数分解为哈希的一种方法。 从那里很容易获得你想要的价值:
def get_params_hash(params) Hash[ *params.split('&').map{ |q| q.split('=') }.flatten ] end p get_params_hash(cookie['fbs_138415639544444'].first)['"access_token'] # >> "138415639544444|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt"
在Ruby 1.9+中,散列会保留其插入顺序,因此如果散列始终具有您想要的值作为其第一个条目,则可以使用
cookie.keys.first #=> "fbs_138415639544444"
否则使用:
cookie.keys.select{ |k| k[/^fbs_/] }.first #=> "fbs_138415639544444"
我从不编写ruby代码,但这听起来像是分裂函数的典型任务。 你只需要拆分它
“\”access_token = 138415639544444 | 5c682220fa7ebccafd97ec58-503523340 | 9HHx3z7GzOBPdk444wtt&expires = 0&secret = 64aa8b3327eafbfd22ba070b&session_key = 5c682220fa7dsfdsafas3523340&sig = 4a494b851ff43d3a58dfa8757b702dfe&uid = 503523340 \“”
按&符号。 结果数组的第一个元素是:
“\”=的access_token 138415639544444 | 5c682220fa7ebccafd97ec58-503523340 | 9HHx3z7GzOBPdk444wtt”
将它拆分为=后 ,结果数组的第二个元素应为:
138415639544444 | 5c682220fa7ebccafd97ec58-503523340 | 9HHx3z7GzOBPdk444wtt
如果你只需要access_key
部分,那么正则表达式可能是最简单的。
cookie["fbs_138415639544444"][0] =~ /access_token\=([-\w\d\|]*)&/ access_key = $1
这里access_key
位于第一个捕获组中,您可以使用$1
获取它。
如果你需要字符串的其他部分(比如session_key
),一个更好的选择可能是使用一对split
并将字符串解析为它自己的hash。
编辑:刚刚意识到你也需要钥匙。
key = cookie.each_key.find { |k| k.start_with? "fbs_" }
然后你可以使用key
来获取值。
由于密钥更改,第一步是获取正确的密钥:
key = cookie.keys.select {|k| k =~ /^fbs_/}.first
如果它们以文本“fbs_”开头,则匹配它们。 返回第一个匹配项。
接下来,您可以通过一些(丑陋的)拆分获得另一个值:
cookie[key].first.split('=')[1].split('&').first
使用正则表达式可能会更清晰,但它取决于该字符串中的有效字符。
正则表达式是脆弱的所以我不会使用那些,当你在最后解析查询字符串参数时,所以使用CGI lib:
> require 'cgi' => true > cookie = {"fbs_138415639544444"=>["\"access_token=138415639544444|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt&expires=0&secret=64aa8b3327eafbfd22ba070b&session_key=5c682220fa7dsfdsafas3523340&sig=4a494b851ff43d3a58dfa8757b702dfe&uid=503523340\""], "_play_session"=>["fdasdfasdf"]} > CGI.parse(cookie.select {|k,v| k =~ /^fbs_/}.first[1][0])["\"access_token"][0] => "138415639544444|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt"
这就是我解决问题的方法……
access_token_key = cookies.keys.find{|item| item.starts_with?('fbs_') } token = cookies[access_token_key].first access_token = token.split("&").find{|item| item.include?('access_token') } fb_access_token = access_token.split("=").find{|item| !item.include?('access_token') }