PHP CURL Разбор нескольких заголовочных файлов cookie с использованием preg_match

Я использую PHP/CURL для автоматизации вызовов между двумя тесно связанными воспламенителем кода.

Код воспламенителя возвращается два set-cookie заголовки, один для безопасного cookie с реальными данными сеанса, один для незащищенных соединений с пустым сеансом...

Set-Cookie: overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path=/
Set-Cookie: overshare=BdHJPVt...STsCxnMBj; path=/; secure

Я пытался разобрать безопасный cookie (оба сайта находятся в одном домене, поэтому, если я получаю обновленную информацию о сеансе через CURL, я должен обновить cookie клиента, как если бы они сделали вызов напрямую)

В настоящее время я использую следующее для анализа куки:

preg_match('/Set-Cookie: (.*)\b/', $Head, $Cookies);

что дает мне в $Cookies:

Array
(
    [0] => Set-Cookie: overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path
    [1] => overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path
)

но это соответствует только первому заголовку set-cookie. Мои навыки регулярных выражений плохие - как я могу сопоставить второй заголовок?

1 ответ

Решение

Если предположить, $Head is a single string containing all of the cookie headers, you're looking for preg_match_all(), preg_match() stops after finding the first match.

С preg_match_all(), matched entire strings will be in $Cookies[0], Your subpattern matches will be in $Cookies[1],

$Head = <<<HEAD
Set-Cookie: overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path=/
Set-Cookie: overshare=BdHJPVt...STsCxnMBj; path=/; secure
HEAD;

preg_match_all('/Set-Cookie: (.*)\b/', $Head, $Cookies);

print_r($Cookies);

доходность

Array
(
    [0] => Array
        (
            [0] => Set-Cookie: overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path
            [1] => Set-Cookie: overshare=BdHJPVt...STsCxnMBj; path=/; secure
        )

    [1] => Array
        (
            [0] => overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path
            [1] => overshare=BdHJPVt...STsCxnMBj; path=/; secure
        )

)

Кроме того, ваш подстановочный знак (.*) по умолчанию является жадным, поэтому может потреблять обе строки вместе, если заголовки не находятся на отдельных строках. Если так, попробуйте (.*?) сделать его неловким.

Другие вопросы по тегам