разбор в рубине - PullRequest
       3

разбор в рубине

0 голосов
/ 10 апреля 2011

У меня есть 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|5c682220fa7ebccafd97ec58-503523340|9HHx3z7GzOBPdk444wtt"

Ответы [ 6 ]

2 голосов
/ 10 апреля 2011

Это обычная задача при декодировании параметров и запросов в URL-адресах 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+ хеши сохраняют свой порядок вставки, поэтому, если хеш всегда имеет значение, которое вы хотите в качестве первой записи, вы можете использовать1004 *

cookie.keys.first #=> "fbs_138415639544444"

иначе использовать:

cookie.keys.select{ |k| k[/^fbs_/] }.first #=> "fbs_138415639544444"
1 голос
/ 10 апреля 2011

Регулярные выражения являются хрупкими, поэтому я бы не стал использовать их, когда в реальности вы в конце разбираете параметры строки запроса, поэтому используйте 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"
1 голос
/ 10 апреля 2011

Поскольку ключ меняется, первым шагом является получение правильного ключа:

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

Это соответствует им, если они начинаются с текста "fbs_". Первый матч возвращается.

Далее вы можете получить другое значение несколькими (безобразными) разбиениями:

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

Использование регулярных выражений может быть немного чище, но это зависит от того, какие символы допустимы в этой строке.

1 голос
/ 10 апреля 2011

Если вам нужна только часть 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, чтобы получить значение.

1 голос
/ 10 апреля 2011

Я никогда не кодирую в ruby, но это звучит как типичная задача для функции split .Вам просто нужно разделить этот

"\" access_token = 138415639544444 | 5c682220fa7ebccafd97ec58-503523340 | 9HHx3z7GzOBPdk444wtt и истекает = 0 & секрет = 64aa8b3327eafbfd22ba070b & session_key = 5c682220fa7dsfdsafas3523340 & сиг = 4a494b851ff43d3a58dfa8757b702dfe & UID = 503523340 \ ""

символом & .Первый элемент массива результатов будет:

"\" access_token = 138415639544444 | 5c682220fa7ebccafd97ec58-503523340 | 9HHx3z7GzOBPdk444wtt "

и разделен на 1017 * *1016*1018 *, а второй элемент массива результатов должен быть:

138415639544444 | 5c682220fa7ebccafd97ec58-503523340 | 9HHx3z7GzOBPdk444wtt

0 голосов
/ 10 апреля 2011

Вот так я решил проблему ...

  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') }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...