用于 cookie 的正则表达式 HTTP 标头,但不超过行尾


Regular Expression HTTP header for cookies while not going over an end of line

我正在遵循堆栈溢出问题的指南,了解如何将 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

正则表达式演示