ruby解析
我有这个ruby解析,ruby,parsing,session,Ruby,Parsing,Session,我有这个散列: cookie = {"fbs_138415639544444"=>["\"access_token=138415639544444|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt&expires=0 &secret=64aa8b3327eafbfd22ba070b&session_key=5c682220fa7dsfdsafas3523340 &sig=4a494b851ff43
散列:
cookie = {"fbs_138415639544444"=>["\"access_token=138415639544444|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt&expires=0
&secret=64aa8b3327eafbfd22ba070b&session_key=5c682220fa7dsfdsafas3523340
&sig=4a494b851ff43d3a58dfa8757b702dfe&uid=503523340\""],
"_play_session"=>["fdasdfasdf"]}
我需要将子字符串从access\u-token=
之后的右边移到&expires
之前的右边。问题是键fbs_1384156395444
中的数字每次都会改变,只是部分fbs_
保持不变
你知道如何只获得:
"138415639544444|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt"
我从来没有用ruby编写过代码,但这听起来像是split函数的典型任务。
你只需要把这个分开
“\”访问令牌=1384156395444 | 5C68220FA7EBCCAFD97EC58-503523340 | 9HHx3z7GzOBPdk444wtt&expires=0
&机密=64aa8b3327eafbfd22ba070b和会话密钥=5C68220FA7DSFDSAFAS3523340
&sig=4A494B851F43D3A58DFA8757B702DFE&uid=503523340“
通过和符号。结果数组的第一个元素是:
“\“访问令牌=1384156395444 | 5C68220FA7EBCCAFD97EC58-503523340 | 9HHx3z7GzOBPdk444wtt”
将其拆分为=后,结果数组的第二个元素应为:
1384156395444 | 5C68220FA7EBCCAFD97EC58-503523340 | 9HHx3z7GzOBPdk444wtt
我从来没有用ruby编写过代码,但这听起来像是split函数的典型任务。
你只需要把这个分开
“\”访问令牌=1384156395444 | 5C68220FA7EBCCAFD97EC58-503523340 | 9HHx3z7GzOBPdk444wtt&expires=0
&机密=64aa8b3327eafbfd22ba070b和会话密钥=5C68220FA7DSFDSAFAS3523340
&sig=4A494B851F43D3A58DFA8757B702DFE&uid=503523340“
通过和符号。结果数组的第一个元素将是:
“\“访问令牌=1384156395444 | 5C68220FA7EBCCAFD97EC58-503523340 | 9HHx3z7GzOBPdk444wtt”
将其拆分为=后,结果数组的第二个元素应为:
1384156395444 | 5C68220FA7EBCCAFD97EC58-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') }
这就是我解决问题的方法
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') }
如果您只需要access\u键
部分,那么正则表达式可能是最简单的
cookie["fbs_138415639544444"][0] =~ /access_token\=([-\w\d\|]*)&/
access_key = $1
这里的access\u键
位于第一个捕获组中,您可以使用$1
获得它
如果您需要字符串的其他部分(例如会话\u键
),一个更好的选择可能是使用一对拆分
并将字符串解析为它自己的散列
编辑:刚刚意识到你也需要钥匙
key = cookie.each_key.find { |k| k.start_with? "fbs_" }
然后您可以使用键
获取值。如果您只需要访问键
部分,那么正则表达式可能是最简单的
cookie["fbs_138415639544444"][0] =~ /access_token\=([-\w\d\|]*)&/
access_key = $1
这里的access\u键
位于第一个捕获组中,您可以使用$1
获得它
如果您需要字符串的其他部分(例如会话\u键
),一个更好的选择可能是使用一对拆分
并将字符串解析为它自己的散列
编辑:刚刚意识到你也需要钥匙
key = cookie.each_key.find { |k| k.start_with? "fbs_" }
然后您可以使用键
获取值。由于键发生变化,第一步是获取正确的键:
key = cookie.keys.select {|k| k =~ /^fbs_/}.first
如果它们以文本“fbs_2;”开头,则这与它们匹配。返回第一个匹配项
接下来,您可以通过几个(丑陋的)分割来获得另一个值:
使用正则表达式可能会更简洁一些,但这取决于该字符串中的有效字符。由于键发生变化,第一步是获得正确的键:
key = cookie.keys.select {|k| k =~ /^fbs_/}.first
如果它们以文本“fbs_2;”开头,则这与它们匹配。返回第一个匹配项
接下来,您可以通过几个(丑陋的)分割来获得另一个值:
使用正则表达式可能更简洁,但这取决于该字符串中的有效字符。这是在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"
这是解码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"
正则表达式是脆弱的,所以当您最终解析查询字符串参数时,我不会使用它们,所以请使用CGI库:
> 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"
正则表达式是脆弱的,所以当您最终解析查询字符串参数时,我不会使用它们,所以请使用CGI库:
> 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"
它是一个特殊的全局变量,用于处理正则表达式匹配(我认为ruby是从perl获得的)。格式为$n
的任何变量,其中n
是一个数字,用于保存上次执行的正则表达式匹配的值$0
保存整个匹配模式$1
是第一个捕获组$2
是第二个捕获组,等等。因此,最重要的是,([-\w\d\|]*)
被放入$1。它是处理正则表达式匹配的一个特殊全局变量(我认为ruby是从perl获得的)。格式为$n
的任何变量,其中n
是一个数字,用于保存上次执行的正则表达式匹配的值$0
保存整个匹配的模式$1
是第一个捕获组$2
是第二个捕获组,等等。因此,最重要的是,([-\w\d\\|]*)
被塞进了$1。在第一个键的值周围额外的引号是怎么回事?似乎很奇怪,它是“\”访问…\”
第一个键的值周围的额外引号是怎么回事?看起来很奇怪,它是“\”访问…\”