Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Извлечь cookie из http-заголовков
 
 автор: Oligarx   (30.06.2008 в 18:45)   письмо автору
 
 

Помогите пожалуйста из заголовков http вытащить переменные кукисов.

Нужно вытащить куки следующего вида:

Set-Cookie: zhuki_stat_enter=deleted; expires=Sun, 01-Jul-2007 10:55:20 GMT
Set-Cookie: zhuki_stat_enter=1
Set-Cookie: test_cookie1=1; path=/
Set-Cookie: test_cookie2=1
Set-Cookie: number_pasport=a%3A6%3A%7Bi%3A6%3Bi%3A1%3Bi%3A5%3Bi%3A4%3Bi%3A4%3Bi%3A9%3Bi%3A3%3Bi%3A5%3Bi%3A2%3Bi%3A6%3Bi%3A1%3Bi%3A0%3B%7D; path=/


Помогите составить регулярки. (я в них ни бум бум)

Заранее спасибо.

   
 
 автор: Oligarx   (01.07.2008 в 00:35)   письмо автору
 
   для: Oligarx   (30.06.2008 в 18:45)
 

Помогите справиться с этой задачей.

Если тупо вот так написать
 
    preg_match("!Set-Cookie:(.*)\n!","Set-Cookie: zhuki_stat_enter=1;\r\n",$out);
    echo ($out[0]);

то всё норм срабатывает, а если написать так ...

    function WriteHeader($fp)
    {
        while(!feof($fp))
        {
            $buff = fgets($fp,1024);
            @preg_match("!Set-Cookie:(.*)\n!",$buff,$out);
            echo ($buff);
            
                    
        }
        echo ($out[0]);
    }


То в массив $out ничего не ложится.

Помогите разобраться почему так получается.


Только что посмотрел в дебагере ... и увидел что на самом деле кукисы вырезаются из заголовков, но почему то не более двух. И если после Отправки куков идёт какой то другой заголовок, то массив $out обнуляется.


cmd> GET / HTTP/1.0
cmd> Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
cmd> User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; DigExt)
cmd> Host: zhuki.mail.ru
cmd> 
hdr> HTTP/1.1 200 OK
hdr> Server: nginx/0.6.10
hdr> Date: Mon, 30 Jun 2008 20:03:02 GMT
hdr> Content-Type: text/html;charset=windows-1251
hdr> Connection: close
hdr> X-Powered-By: PHP/5.2.4_p20070914-pl2-gentoo
cookie> zhuki_stat_enter=deleted; expires=Sun, 01-Jul-2007 20:03:01 GMT
hdr> Set-Cookie: zhuki_stat_enter=deleted; expires=Sun, 01-Jul-2007 20:03:01 GMT
cookie> zhuki_stat_enter=1
hdr> Set-Cookie: zhuki_stat_enter=1
hdr> Expires: Mon, 26 Jul 1997 05:00:00 GMT
hdr> Last-Modified: Mon, 30 Jun 2008 20:03:02 GMT
hdr> Cache-Control: no-store, no-cache, must-revalidate
hdr> Pragma: no-cache
hdr> Cache-Control: post-check=0, pre-check=0
cookie> test_cookie1=1; path=/
hdr> Set-Cookie: test_cookie1=1; path=/
cookie> test_cookie2=1
hdr> Set-Cookie: test_cookie2=1
cookie> number_pasport=a%3A6%3A%7Bi%3A6%3Bi%3A3%3Bi%3A5%3Bi%3A9%3Bi%3A4%3Bi%3A1%3Bi%3A3%3Bi%3A6%3Bi%3A2%3Bi%3A6%3Bi%3A1%3Bi%3A9%3B%7D; path=/
hdr> Set-Cookie: number_pasport=a%3A6%3A%7Bi%3A6%3Bi%3A3%3Bi%3A5%3Bi%3A9%3Bi%3A4%3Bi%3A1%3Bi%3A3%3Bi%3A6%3Bi%3A2%3Bi%3A6%3Bi%3A1%3Bi%3A9%3B%7D; path=/
hdr> Vary: Accept-Encoding
RequestDone Error = 0
StatusCode = 200


Почему так получается мне не понятно. Помогите разобраться пожалуйста.

   
 
 автор: Эй   (01.07.2008 в 08:53)   письмо автору
 
   для: Oligarx   (01.07.2008 в 00:35)
 

Потому что массив $out у вас переопределяется при каждой иттерации цикла, т.е. для каждого заголовка.

preg_match_all('~^Set-Cookie:(.*)\\r$~m', $headers, $matches);

В $headers должны быть все заголовки.

   
 
 автор: Oligarx   (01.07.2008 в 09:57)   письмо автору
 
   для: Эй   (01.07.2008 в 08:53)
 

Вот, переписал так

    function WriteHeader($fp)
    {
        $out;
        $text="";
        $i=0;
        while(!feof($fp))
        {
            $buff = fgets($fp,1024);
            
            //preg_replace("!Set-Cookie:(.*)\n!","",$text);
            //preg_match("!Set-Cookie:(.*)\n!",$buff,$out[$i]);
            
            //@$cook[$i]=preg_replace("!Set-Cookie:(.*)\n!",$buff);
            echo ($buff);
            $text .= $buff;
                    
        }
        preg_match("!Set-Cookie:(.*)\n!",$text,$out);
        echo ($out[0]);
        echo ("<br>");
        echo ($out[1]);
    }


Но всё равно что то нитак. Выводятся не все куки, а только первые два.

   
 
 автор: Эй   (01.07.2008 в 10:03)   письмо автору
 
   для: Oligarx   (01.07.2008 в 09:57)
 

Странно, что не один. Функция preg_match находит только первое совпадение. Я написал пример выше.

   
 
 автор: Oligarx   (01.07.2008 в 10:34)   письмо автору
 
   для: Эй   (01.07.2008 в 10:03)
 

Уважаемый, покажите пожалуйста как мне исправить мою функцию чтобы все куки свалились в массив.

А то похоже я что то недогоняю ...

   
 
 автор: Эй   (01.07.2008 в 10:43)   письмо автору
 
   для: Oligarx   (01.07.2008 в 10:34)
 

        $text=""; 
        $i=0; 
        while(!feof($fp)) 
        { 
            $buff = fgets($fp,1024); 
             
            //preg_replace("!Set-Cookie:(.*)\n!","",$text); 
            //preg_match("!Set-Cookie:(.*)\n!",$buff,$out[$i]); 
             
            //@$cook[$i]=preg_replace("!Set-Cookie:(.*)\n!",$buff); 
            echo ($buff); 
            $text .= $buff; 
                     
        } 
        preg_match_all('~^Set-Cookie:(.*)\\r$~m', $text, $matches);
        print_r($matches);

   
 
 автор: Oligarx   (01.07.2008 в 11:02)   письмо автору
 
   для: Эй   (01.07.2008 в 10:43)
 

Теперь выводится. ... но почему то дублируется:


     Array ( [0] => Array ( 
                              [0] => Set-Cookie: zhuki_stat_enter=deleted; expires=Mon, 02-Jul-2007 06:56:19 GMT 
                              [1] => Set-Cookie: zhuki_stat_enter=1 
                              [2] => Set-Cookie: test_cookie1=1; path=/ 
                              [3] => Set-Cookie: test_cookie2=1 
                              [4] => Set-Cookie:number_pasport=a%3A6%3A%7Bi%3A6%3Bi%3A5%3Bi%3A5%3Bi%3A6%3Bi%3A4%3Bi%3A5%3Bi%3A3%3Bi%3A0%3Bi%3A2%3Bi%3A6%3Bi%3A1%3Bi%3A9%3B%7D; path=/ ) 
                  [1] => Array ( 
                              [0] => zhuki_stat_enter=deleted; expires=Mon, 02-Jul-2007 06:56:19 GMT 
                              [1] => zhuki_stat_enter=1 
                              [2] => test_cookie1=1; path=/ 
                              [3] => test_cookie2=1
                              [4] =>number_pasport =a%3A6%3A%7Bi%3A6%3Bi%3A5%3Bi%3A5%3Bi%3A6%3Bi%3A4%3Bi%3A5%3Bi%3A3%3Bi%3A0%3Bi%3A2%3Bi%3A6%3Bi%3A1%3Bi%3A9%3B%7D; path=/ ) )


Незнаете почему может дублироваться ? ... я непонимаю почему.

   
 
 автор: Oligarx   (01.07.2008 в 11:07)   письмо автору
 
   для: Oligarx   (01.07.2008 в 11:02)
 

Ой ... что то незаметил сразу ... значения то у них разные.

Первый подмассив:

Set-Cookie: zhuki_stat_enter=deleted; expires=Mon, 02-Jul-2007 07:05:13 GMT 
Set-Cookie: zhuki_stat_enter=1 
Set-Cookie: test_cookie1=1; path=/ 
Set-Cookie: test_cookie2=1 
Set-Cookie: number_pasport=a%3A6%3A%7Bi%3A6%3Bi%3A5%3Bi%3A5%3Bi%3A1%3Bi%3A4%3Bi%3A4%3Bi%3A3%3Bi%3A6%3Bi%3A2%3Bi%3A5%3Bi%3A1%3Bi%3A1%3B%7D; path=/


Второй подмассив:

zhuki_stat_enter=deleted; expires=Mon, 02-Jul-2007 07:05:13 GMT
zhuki_stat_enter=1
test_cookie1=1; path=/
test_cookie2=1
number_pasport=a%3A6%3A%7Bi%3A6%3Bi%3A5%3Bi%3A5%3Bi%3A1%3Bi%3A4%3Bi%3A4%3Bi%3A3%3Bi%3A6%3Bi%3A2%3Bi%3A5%3Bi%3A1%3Bi%3A1%3B%7D; path=/


Вот второй то мне и нужен.

Спасибо за помощь.

   
 
 автор: mihdan   (01.07.2008 в 11:09)   письмо автору
 
   для: Oligarx   (01.07.2008 в 11:02)
 

Нда - вам стоит прочитать про print_r() и preg_match_all() для начала, ничего он не дублирует!!!

   
 
 автор: Oligarx   (01.07.2008 в 11:26)   письмо автору
 
   для: mihdan   (01.07.2008 в 11:09)
 

Как это ?!

Вот вид массива который он возвращает :


     Array ( [0] => Array ( [0] => Set-Cookie: zhuki_stat_enter=deleted; expires=Mon, 02-Jul-2007 07:05:13 GMT 
                [1] => Set-Cookie: zhuki_stat_enter=1 
                [2] =>Set-Cookie: test_cookie1=1; path=/ 
                [3] => Set-Cookie: test_cookie2=1 
                [4] => Set-Cookie: number_pasport=a%3A6%3A%7Bi%3A6%3Bi%3A5%3Bi%3A5%3Bi%3A1%3Bi%3A4%3Bi%3A4%3Bi%3A3%3Bi%3A6%3Bi%3A2%3Bi%3A5%3Bi%3A1%3Bi%3A1%3B%7D; path=/ )
         [1] => Array ( [0] => zhuki_stat_enter=deleted; expires=Mon, 02-Jul-2007 07:05:13 GMT 
                [1] => zhuki_stat_enter=1 
                [2] => test_cookie1=1; path=/ 
                [3] => test_cookie2=1 
                [4] => number_pasport=a%3A6%3A%7Bi%3A6%3Bi%3A5%3Bi%3A5%3Bi%3A1%3Bi%3A4%3Bi%3A4%3Bi%3A3%3Bi%3A6%3Bi%3A2%3Bi%3A5%3Bi%3A1%3Bi%3A1%3B%7D; path=/ ) )


Оба подмассива почти одинаковые... отличие только в том, что в первом массиве Set-Cookie:* , а во втром сразу переменная куков = значению.

Причём тут print_r() ?

   
 
 автор: mihdan   (01.07.2008 в 11:42)   письмо автору
 
   для: Oligarx   (01.07.2008 в 11:26)
 

Вы так и не поняли ???
В массиве с индексом 0 - массив полных вхождений шаблона, дальше - то, что соответствует первой подмаски, и так далее, поэтому вам нужен массив с индексом 1

   
 
 автор: mihdan   (01.07.2008 в 10:57)   письмо автору
 
   для: Oligarx   (01.07.2008 в 09:57)
 

Да вам же написали preg_match_all()

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования