2011-04-09 189 views
0

我有這個Hash解析紅寶石

cookie = {"fbs_138415639544444"=>["\"access_token=138415639544444|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt&expires=0 
&secret=64aa8b3327eafbfd22ba070b&session_key=5c682220fa7dsfdsafas3523340 
&sig=4a494b851ff43d3a58dfa8757b702dfe&uid=503523340\""], 
"_play_session"=>["fdasdfasdf"]} 

我需要&expires之前,之後access_token=得到串到右邊。問題是每次更改密鑰fbs_138415639544444中的數字,只是部分fbs_保持不變。

任何想法如何只得到:

"138415639544444|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt" 
+1

什麼是第一個關鍵的值附加額外報價?似乎奇怪,它是'「\」訪問.... \「」' – Wes 2011-04-10 06:58:18

回答

1

我從來沒有在Ruby代碼,但是這聽起來像典型任務拆分功能。 你只需要分割這個

「\」=的access_token 138415639544444 | 5c682220fa7ebccafd97ec58-503523340 | 9HHx3z7GzOBPdk444wtt &到期= 0 &祕密= 64aa8b3327eafbfd22ba070b & session_key可以= 5c682220fa7dsfdsafas3523340 & SIG = 4a494b851ff43d3a58dfa8757b702dfe &的uid = 503523340 \ 「」

作者&符號。結果陣列的第一個元素是:

「\」=的access_token 138415639544444 | 5c682220fa7ebccafd97ec58-503523340 | 9HHx3z7GzOBPdk444wtt」

和拆分它由=,和結果陣列的第二個元素之後應該是:

138415639544444 | 5c682220fa7ebccafd97ec58-503523340 | 9HHx3z7GzOBPdk444wtt

0

這是我如何解決這個問題?

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

如果你只需要access_key部分,那麼正則表達式是可能比較容易。

cookie["fbs_138415639544444"][0] =~ /access_token\=([-\w\d\|]*)&/ 
access_key = $1 

這裏access_key是第一個捕獲組中,你可以用$1得到它。

如果您需要字符串的其他部分(比如說session_key),那麼更好的選擇可能是使用幾個split s並將字符串解析爲它自己的散列。

編輯:剛纔意識到你也需要鑰匙。

key = cookie.each_key.find { |k| k.start_with? "fbs_" } 

然後您可以使用key來獲取該值。

+0

你可以解釋1美元我有點...這個作品真棒 – Trace 2011-04-09 23:40:39

+0

這是一個特殊的全局變量處理正則表達式匹配(我認爲紅寶石它來自perl)。形式爲'$ n'的任何變量,其中'n'是一個數字,保存來自上一次執行的正則表達式匹配的值。 '$ 0'包含整個匹配模式'$ 1'是第一個捕獲組'$ 2'是第二個等,因此,高於[(\ - \ w \ d \ | *)*)匹配的所有匹配模式被推入$ 1。 – Andy 2011-04-10 00:03:46

1

由於密鑰改變,第一步是要得到正確的鑰匙:

key = cookie.keys.select {|k| k =~ /^fbs_/}.first 

這符合他們是否與文本「fbs_」開始。第一場比賽返回。

接下來,您可以得到由幾個(醜陋的)另一個值分割:

cookie[key].first.split('=')[1].split('&').first 

使用正則表達式可能是有點清潔,但要看是什麼有效的字符在該字符串。

2

這是解碼HTML網址中的參數和查詢時的常見任務。這裏有一個方法將參數分解成一個散列。從這裏可以很容易地得到你想要的值:

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" 
1

Regexs是易碎的,所以當現實是你到底解析查詢字符串PARAMS我不會用那些因此使用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"