У меня есть некоторые проблемы с 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
Спасибо за ваши ответы.
Попробуйте не группировать? с (. *) так:
preg_match("/PHPSESSID=(.*)?(:;|\r\n)?/", $code, $phpsessid);
Учитывая входную строку ОП …
Образец ОП работает Образец Демо (131 шаг)
В настоящее время принят ответ некорректный — это наверняка запутает будущих читателей. Образец Демо
Но давайте удостоверимся, что вы используете самый эффективный, самый короткий, самый лучший шаблон …
/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 шага) Образец Демо
Входные данные:
$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%. Я надеюсь, что эти лучшие практики будут полезны для будущих читателей.