Немного поздно, но я разочарован мной для не предложение чего-то более изящного. У любого есть лучший способ сделать это...
Когда Вы передаете код OAuth Facebook, это ответ со строкой запроса, содержащей access_token
и expires
значения.
access_token=121843224510409|2.V_ei_d_rbJt5iS9Jfjk8_A__.3600.1273741200-569255561|TxQrqFKhiXm40VXVE1OBUtZc3Ks.&expires=4554
Хотя, если Вы запрашиваете разрешение на офлайновый доступ, существует нет expires
и строка похожа на это:
access_token=121843224510409|2.V_ei_d_rbJt5iS9Jfjk8_A__.3600.1273741200-569255561|TxQrqFKhiXm40VXVE1OBUtZc3Ks.
Я попытался записать regex, который будет достаточен для любого условия. Провал. Таким образом, я закончил с некоторым действительно ужасным Ruby:
s = s.split("=")
@oauth = {}
if s.length == 3
@oauth[:access_token] = s[1][0, s[1].length - 8]
@oauth[:expires] = s[2]
else
@oauth[:access_token] = s[1]
end
Я знаю, что должен быть лучший путь!
Если формат строгий, то вы используете это регулярное выражение:
access_token=([^&]+)(?:&expires=(.*))?
Тогда значение access_token
находится в \ 1
, а истекает
, если есть , будет в \ 2
.
Сначала разделить на символ и
, а затем разделить каждый результат на =
? Это метод, который может справиться с изменением порядка, поскольку он анализирует каждую пару ключ-значение индивидуально.
В качестве альтернативы, регулярное выражение, которое должно работать, будет ...
/access_token=(.*?)(?:&expires=(.*))/
Разбор строки запроса обычно включает следующие шаги:
?
&
имя=значение
разделите их на =
значение
и имя
(!). )Использование regex возможно, но делает неверные предположения о состоянии URL-кодирования строки и не работает, если порядок строки запроса меняется, что вполне допустимо и поэтому не может быть исключено. Лучше заключить все вышесказанное в небольшую функцию парсинга или использовать одну из существующих библиотек обработки URL вашей платформы.