Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby解析_Ruby_Parsing_Session - Fatal编程技术网

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。在第一个键的值周围额外的引号是怎么回事?似乎很奇怪,它是
“\”访问…\”
第一个键的值周围的额外引号是怎么回事?看起来很奇怪,它是
“\”访问…\”