Regex 解析Facebook OAuth 2访问令牌字符串的最聪明方法
虽然有点晚了,但我对自己没有想出更优雅的东西感到失望。任何人都有更好的方法做到这一点 当您将OAuth代码传递给Facebook时,它将使用包含Regex 解析Facebook OAuth 2访问令牌字符串的最聪明方法,regex,Regex,虽然有点晚了,但我对自己没有想出更优雅的东西感到失望。任何人都有更好的方法做到这一点 当您将OAuth代码传递给Facebook时,它将使用包含access\u token和expires值的查询字符串进行响应 access_token=121843224510409|2.V_ei_d_rbJt5iS9Jfjk8_A__.3600.1273741200-569255561|TxQrqFKhiXm40VXVE1OBUtZc3Ks.&expires=4554 虽然如果您请求脱机访问权限,但
access\u token
和expires
值的查询字符串进行响应
access_token=121843224510409|2.V_ei_d_rbJt5iS9Jfjk8_A__.3600.1273741200-569255561|TxQrqFKhiXm40VXVE1OBUtZc3Ks.&expires=4554
虽然如果您请求脱机访问权限,但不会有任何过期
,字符串如下所示:
access_token=121843224510409|2.V_ei_d_rbJt5iS9Jfjk8_A__.3600.1273741200-569255561|TxQrqFKhiXm40VXVE1OBUtZc3Ks.
我试图编写一个正则表达式,它可以满足任何一种条件。没有骰子。所以我最终得到了一些非常难看的红宝石:
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=([^&]+)(?:&expires=(.*))?
然后
access\u token
值在\1
中,并且过期
如果有,将在\2
中,查询字符串解析通常包括以下步骤:
?
&
name=value
对,在=
值
和名称
(!)使用正则表达式是可能的,但对字符串所处的URL编码状态做出无效假设,如果查询字符串的顺序发生变化,则会失败,这是完全允许的,因此不能排除。最好将上述内容封装在一个小的解析函数中,或者使用您平台上现有的URL处理库。这就是我一直在玩的那个。当“&expires=”不在字符串中时,它会失败。嗯,那么您的实现很差-您不应该显式引用索引,而是查看每个
=
拆分的第一部分中的键。如中所示,a=s.split(&)
,然后对于a
中的每个值,p=a.split(=”
),首先检查键名的p[0]
等于什么,然后根据键将p[1]
分配给适当的变量。那么,你的绳子里有什么就不重要了。这就是首先使用split
的全部优点。此外,OP中的代码仅在=
上拆分,而不是在&
上拆分。很抱歉,未能读取split
指令。如果你修改了你的答案(任何内容),我可以投票支持。谢谢。严格地说,是的,只要“&”不是访问令牌的一部分,这就行了。不确定这是否是一个安全的假设。在规范中找不到任何要验证的内容。