正则表达式模式从字符串中提取PHPSESSID值

时间:2017-05-24 09:45:38

标签: php regex preg-match sessionid

我遇到preg_match()的一些问题。 我使用了这段代码(以前它曾经很好用):

preg_match("/PHPSESSID=(.*?)(?:;|\r\n)/", $code, $phpsessid);

但现在它不再工作了。 (返回一个空数组)。

我的主题:HTTP/1.1 302 Moved Temporarily Server: nginx/1.8.0 Date: Wed, 24 May 2017 08:58:57 GMT Content-Type: text/html Transfer-Encoding: chunked Connection: keep-alive X-Powered-By: PHP/5.3.10-1ubuntu3.18 Set-Cookie: PHPSESSID=jrq8446q91fv6eme2ois3lpl07; expires=Thu, 24-May-2018 08:58:57 GMT; path=/; Expires: Thu, 19 Nov 1981 08:52:00 GMT Pragma: no-cache Cache-Control: no-store, no-cache, must-revalidate Location: index.php *

我需要获取PHPSESSID值:jrq8446q91fv6eme2ois3lpl07

感谢您的回答。

3 个答案:

答案 0 :(得分:0)

http://www.php.net/session_id怎么办?

$ sessionid = session_id();

/拉塞

答案 1 :(得分:0)

尝试不分组?与(。*)所以:

preg_match("/PHPSESSID=(.*)?(:;|\r\n)?/", $code, $phpsessid);

答案 2 :(得分:0)

给出OP的输入字符串......

OP的模式有效Pattern Demo(131步)

目前接受的答案不正确 - 这肯定会让未来的读者感到困惑。 Pattern Demo

但是,让我们确保您使用最有效,最简短,最好的模式...

/PHPSESSID=\K[a-z\d]*/  #no capture group, 23 steps (accurate for sample input)
/PHPSESSID=\K[^;]*/     #no capture group, 23 steps (accurate for sample input)
/PHPSESSID=\K\w*/       #no capture group, 23 steps (not inaccurate, includes underscores)

如果您希望将\r\n视为PHPSESSID值的可能分隔符,则可以将这些字符添加到“否定字符类”中,如下所示:[^;\r\n](它仍将以23个步骤运行)Pattern Demo

输入:

$subject='HTTP/1.1 302 Moved Temporarily Server: nginx/1.8.0 Date: Wed, 24 May 2017 08:58:57 GMT Content-Type: text/html Transfer-Encoding: chunked Connection: keep-alive X-Powered-By: PHP/5.3.10-1ubuntu3.18 Set-Cookie: PHPSESSID=jrq8446q91fv6eme2ois3lpl07; expires=Thu, 24-May-2018 08:58:57 GMT; path=/; Expires: Thu, 19 Nov 1981 08:52:00 GMT Pragma: no-cache Cache-Control: no-store, no-cache, must-revalidate Location: index.php
*';

单线方法(PHP Demo):

echo preg_match('/PHPSESSID=\K[^;\r\n]*/',$subject,$out)?$out[0]:'';

输出:

jrq8446q91fv6eme2ois3lpl07

请注意,使用\K不需要使用捕获组,这会将输出数组大小减少50%。我希望这些最佳实践能够教育未来的读者。