在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') }