Как извлечь PHPSESSID из вывода заголовка CURL - PullRequest
2 голосов
/ 14 декабря 2011

У меня вопрос:

Если я установлю cURL для включения в заголовок информации заголовка, как мне извлечь из этого вывода только информацию PHPSESSID?

Вывод выглядит примерно так:

OUTPUT: HTTP/1.1 100 Continue HTTP/1.1 200 OK Date: Wed, 26 Sep 2011 19:10:48 GMT    Server: Apache/2.2.16 (Win32) mod_ssl/2.2.16 OpenSSL/0.9.8o X-Powered-By: PHP/5.3.5 Set-Cookie: PHPSESSID=lsa18d8r126ps1vfp4h05dh8r4; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache     Transfer-Encoding: chunked Content-Type: text/html 

Ответы [ 3 ]

2 голосов
/ 15 декабря 2011

Это очень простое решение, я не знаю, есть ли какой-нибудь способ curl для его получения, но его можно обработать простым регулярным выражением.

$foo="HTTP/1.1 100 Continue HTTP/1.1 200 OK Date: Wed, 26 Sep 2011 19:10:48 GMT    Server: Apache/2.2.16 (Win32) mod_ssl/2.2.16 OpenSSL/0.9.8o X-Powered-By: PHP/5.3.5 Set-Cookie: PHPSESSID=lsa18d8r126ps1vfp4h05dh8r4; path=/ Expires: Thu,19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache     Transfer-Encoding: chunked Content-Type: text/html";

echo preg_replace("/.*PHPSESSID=([^;]*);.*/", "\\1", $foo);

Если строка синтаксически одинакова для каждого запроса, вы можете сделать это, как показано. ";" который обозначает окончание идентификатора сеанса, является обязательным, в противном случае регулярное выражение завершается ошибкой и возвращает всю строку, потому что она не совпадает. Возможно, вам следует использовать preg_match перед извлечением, чтобы убедиться, что оно синтаксически правильно, или даже в строке есть PHPSESSID.

0 голосов
/ 09 августа 2013

Я только хочу улучшить ответ @ evildead.Его ответ не работает, если выходная строка заголовка содержит разрывы строк или когда заголовок cookie заканчивается сразу после sessid (поэтому нет точки с запятой).

$foo="HTTP/1.1 100 Continue HTTP/1.1 200 OK Date: Wed, 26 Sep 2011 19:10:48 GMT\r\nServer: Apache/2.2.16 (Win32) mod_ssl/2.2.16 OpenSSL/0.9.8o X-Powered-By: PHP/5.3.5 Set-Cookie: PHPSESSID=lsa18d8r126ps1vfp4h05dh8r4; path=/ Expires: Thu,19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache     Transfer-Encoding: chunked Content-Type: text/html";
preg_match("/PHPSESSID=(.*?)(?:;|\r\n)/", $foo, $matches);
echo $matches[1];

Если может быть хорошей идеей проверить PHPSESSIDсуществование тоже:

$foo="HTTP/1.1 100 Continue HTTP/1.1 200 OK Date: Wed, 26 Sep 2011 19:10:48 GMT\r\nServer: Apache/2.2.16 (Win32) mod_ssl/2.2.16 OpenSSL/0.9.8o X-Powered-By: PHP/5.3.5 Set-Cookie: PHPSESSID=lsa18d8r126ps1vfp4h05dh8r4; path=/ Expires: Thu,19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache     Transfer-Encoding: chunked Content-Type: text/html";
if(preg_match("/PHPSESSID=(.*?)(?:;|\r\n)/", $foo, $matches)){
    echo $matches[1];
}else{
    /* Do something */
}
0 голосов
/ 15 декабря 2011

Вы можете написать еще немного кода, чтобы разобрать заголовки из ответа. К сожалению, curl не делает этого для вас.

Ниже приведен краткий пример того, как это сделать:

$url = 'http://stackoverflow.com';

// prepare curl
    $curl_handle = curl_init();
    curl_setopt( $curl_handle, CURLOPT_HEADER, true );
    curl_setopt( $curl_handle, CURLOPT_URL, $url );

// make request
    ob_start();
        $result = curl_exec ( $curl_handle ); // execute the curl command
    $response = ob_get_clean();

// parse the response
    $info = curl_getinfo( $curl_handle );
    curl_close( $curl_handle );
    $raw_headers = explode("\n", substr($response, 0, $info['header_size']) );

// Parse (named) headers
    $headers = array();

    foreach( $raw_headers as $header ){

        if( preg_match('/^(.*?)\\:\\s+(.*?)$/m', $header, $header_parts) ){
            $headers[$header_parts[1]] = $header_parts[2];
        }
    }

// get the body
    $body = substr($response, -$info['download_content_length']);  


// now you can get your headers from $headers by index
    echo $headers['PHPSESSID'];

var_dump массива $ headers будет выглядеть так:

array(7) {
  ["Cache-Control"]=>
  string(19) "public, max-age=57
"
  ["Content-Type"]=>
  string(25) "text/html; charset=utf-8
"
  ["Expires"]=>
  string(30) "Wed, 14 Dec 2011 23:37:21 GMT
"
  ["Last-Modified"]=>
  string(30) "Wed, 14 Dec 2011 23:36:21 GMT
"
  ["Vary"]=>
  string(2) "*
"
  ["Date"]=>
  string(30) "Wed, 14 Dec 2011 23:36:23 GMT
"
  ["Content-Length"]=>
  string(7) "197298
"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...