Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Regex 解析Facebook OAuth 2访问令牌字符串的最聪明方法_Regex - Fatal编程技术网

Regex 解析Facebook OAuth 2访问令牌字符串的最聪明方法

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 虽然如果您请求脱机访问权限,但

虽然有点晚了,但我对自己没有想出更优雅的东西感到失望。任何人都有更好的方法做到这一点

当您将OAuth代码传递给Facebook时,它将使用包含
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
中,查询字符串解析通常包括以下步骤:

  • 如果是完整的URL,请在第一个
  • &
  • 对于每个生成的
    name=value
    对,在
    =
  • URL解码到
    名称
    (!)
  • 将结果填入您喜欢的数据结构中

  • 使用正则表达式是可能的,但对字符串所处的URL编码状态做出无效假设,如果查询字符串的顺序发生变化,则会失败,这是完全允许的,因此不能排除。最好将上述内容封装在一个小的解析函数中,或者使用您平台上现有的URL处理库。

    这就是我一直在玩的那个。当“&expires=”不在字符串中时,它会失败。嗯,那么您的实现很差-您不应该显式引用索引,而是查看每个
    =
    拆分的第一部分中的键。如中所示,
    a=s.split(&)
    ,然后对于
    a
    中的每个值,
    p=a.split(=”
    ),首先检查键名的
    p[0]
    等于什么,然后根据键将
    p[1]
    分配给适当的变量。那么,你的绳子里有什么就不重要了。这就是首先使用
    split
    的全部优点。此外,OP中的代码仅在
    =
    上拆分,而不是在
    &
    上拆分。很抱歉,未能读取
    split
    指令。如果你修改了你的答案(任何内容),我可以投票支持。谢谢。严格地说,是的,只要“&”不是访问令牌的一部分,这就行了。不确定这是否是一个安全的假设。在规范中找不到任何要验证的内容。