我正在遵循堆栈溢出问题的指南,了解如何将 cookie 从 php curl 获取到变量中。普遍接受的答案使用正则表达式来获取标头所有行中的所有 cookie。
preg_match_all('/^Set-Cookie:'s*([^;]*)/mi', $result, $matches);
由于可以有多个Set-Cookie
标头,因此这将匹配任何和所有标头。
但是,我发现它假设每个cookie都以分号结尾。我没有发现任何证据表明这是一项要求。事实上,我正在使用的网络服务只返回一个cookie,没有结束分号。因此,当我返回这些标头时:
HTTP/1.1 200 OK
Content-Length: 27
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: http://localhost
Set-Cookie: sessionToken=22A2...DB87
X-Powered-By: ASP.NET
Date: Tue, 16 Feb 2016 16:28:12 GMT
并且我用解析代码查看cookie sessionToken
,得到这个值:
22A2...DB87
X-Powered-By: ASP.NET
Date: Tue, 16 Feb 2016 16:28:12 GMT
它基本上将其余的标头作为cookie的一部分。这不是我要找的。
我并不为我的正则表达能力感到自豪。我试图对它所做的更改没有奏效。当我尝试在括号部分添加$
时,它没有帮助。如果是在最后,它与任何东西都不匹配。
我的正则表达式应该是什么样子才能防止它通过 EOL?
为了完整起见,这是我一直在使用的 php:
preg_match_all('/^Set-Cookie:'s*([^;]*)/mi', $header, $matches);
$cookies = array();
foreach($matches[1] as $item)
{
parse_str($item, $cookie);
$cookies = array_merge($cookies, $cookie);
}
$sessionToken = $cookies["sessionToken"];
您应该在负字符类中添加换行符:
/^Set-Cookie:'s*([^;'r'n]*)/mi
([^;'r'n]*)
只会捕获 0 或任何不是;
、不是'r
和不是'n
的字符,因此在行尾停止,而不是跨行寻找分号。
通过此更改,捕获的组 #1 将具有sessionToken=22A2...DB87
正则表达式演示