Página 1 de 1

Parsear Cookies en PHP

NotaPublicado: 2014-10-09 19:49 @867
por BigBear
Hola. Estoy tratando de analizar cookies con PHP, encontré esta función pero PHP me dice que no existe: http://php.net/manual/es/function.http-parse-cookie.php Intenté improvisar a mi manera y casi lo tengo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <?php
  2.  
  3. $line = "foo=bar; path=/; domain=example.com; comment=;";
  4.  
  5. $tokens = explode(" ", $line);
  6. $tokens = array_map('trim', $tokens);
  7.  
  8. echo print_r($tokens);
  9.  
  10.  
  11. ?>
Coloreado en 0.019 segundos, usando GeSHi 1.0.8.4

El tema es que captura todos los campos pero el problema es que no conozco la estructura de cómo se ven los campos vi muchas cookies de otras páginas y a veces varían las posiciones, o sea al principio pensaba que el primero siempre era el nombre y el contenido pero después resulto que el primero era el dominio y el ruta. ¿ Alguien me podría explicar la estructura definitiva ?

Re: Parsear Cookies en PHP

NotaPublicado: 2014-10-09 20:32 @897
por explorer
La función http_parse_cookie() está dentro de la biblioteca pecl_http, que hay que instalar aparte.

En el propio enlace que has publicado viene un ejemplo (en el último comentario) de una función alternativa detallada en PHP.

La estructura de la cookie está, naturalmente, en un RFC (el 6265), pero como no lo vas a leer, quizás te sirva el resumen que aparece en la Wikipedia (en inglés; en la versión en español hay poco detalle).

Re: Parsear Cookies en PHP

NotaPublicado: 2014-10-09 20:42 @904
por BigBear
Ok, mira cómo quedó el código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. < ?php
  2.  
  3. function cookie_parse( $line ) {
  4.         $cookies = array();
  5.         $csplit = explode( ';', $line );
  6.         $cdata = array();
  7.         foreach( $csplit as $data ) {
  8.                 $cinfo = explode( '=', $data );
  9.                 $cinfo[0] = trim( $cinfo[0] );
  10.                 if( $cinfo[0] == 'expires' ) $cinfo[1] = strtotime( $cinfo[1] );
  11.                 if( $cinfo[0] == 'secure' ) $cinfo[1] = "true";
  12.                 if( in_array( $cinfo[0], array( 'domain', 'expires', 'path', 'secure', 'comment' ) ) ) {
  13.                         $cdata[trim( $cinfo[0] )] = $cinfo[1];
  14.                 }
  15.                 else {
  16.                         $cdata['value']['key'] = $cinfo[0];
  17.                         $cdata['value']['value'] = $cinfo[1];
  18.                 }
  19.         }
  20.         $cookies[] = $cdata;
  21.  
  22.         return $cookies;
  23. }
  24.  
  25.  
  26. $line = "foo=bar; path=/; domain=example.com; comment=;";
  27.  
  28. echo print_r(cookie_parse($line));
  29.  
  30. ? >
  31.  
Coloreado en 0.010 segundos, usando GeSHi 1.0.8.4

Devuelve:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Array ( [0] => Array ( [value] => Array ( [key] => [value] => ) [path] => / [domain] => example.com [comment] => ) ) 1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¿ Por qué no me detecta el nombre y el valor ? ¿ Cómo lo arreglo ?

Re: Parsear Cookies en PHP

NotaPublicado: 2014-10-09 23:18 @013
por explorer
A la presencia del último ';' en la variable $line.

Una cosa... print_r() no necesita de ningún echo().

Re: Parsear Cookies en PHP

NotaPublicado: 2014-10-10 16:23 @724
por BigBear
Ya entendí, explorer, gracias por la ayuda. Mira: dejo el código que hice para resolver este problema:

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <?php
  2.  
  3. function parsear_cookie($leyendo) {
  4.  
  5. // Coded By Doddy
  6. // Thanks to explorer
  7.  
  8. $leyendo =  str_replace("comment=","",$leyendo);
  9. $contenido = explode(";", $leyendo);
  10.  
  11. $nombre = "null";
  12. $valor_cookie = "null";
  13. $expires = "null";
  14. $path = "null";
  15. $domain = "null";
  16. $secure = "null";
  17. $httponly = "null";
  18.  
  19. foreach( $contenido as $valor ) {
  20.  
  21. if(preg_match("/expires=(.*)/",$valor,$regex)) {
  22. $expires = $regex[1];
  23. }
  24.  
  25. elseif(preg_match("/path=(.*)/",$valor,$regex)) {
  26. $path = $regex[1];
  27. }
  28.  
  29. elseif(preg_match("/domain=(.*)/",$valor,$regex)) {
  30. $domain = $regex[1];
  31. }
  32.  
  33. elseif(preg_match("/secure=(.*)/",$valor,$regex)) {
  34. $secure = $regex[1];
  35. }
  36.  
  37. elseif(preg_match("/httponly=(.*)/",$valor,$regex)) {
  38. $httponly = $regex[1];
  39. }
  40.  
  41. else {
  42.  
  43. if(preg_match("/(.*)=(.*)/",$valor,$regex)) {
  44. $nombre = $regex[1];
  45. $valor_cookie = $regex[2];
  46. }
  47.  
  48. }
  49.  
  50. }
  51.  
  52. return array($nombre,$valor_cookie,$expires,$path,$domain,$secure,$httponly);
  53.  
  54. }
  55.  
  56. $cookie = "foo=bar; path=/; domain=example.com; comment=;";
  57.  
  58. list($nombre,$valor_cookie,$expires,$path,$domain,$secure,$httponly) = parsear_cookie($cookie);
  59.  
  60. echo "name : $nombre"."<br>";
  61. echo "valor : $valor_cookie"."<br>";
  62. echo "expires : $expires"."<br>";
  63. echo "path : $path"."<br>";
  64. echo "domain : $domain"."<br>";
  65. echo "secure : $secure"."<br>";
  66. echo "httponly : $httponly"."<br>";
  67.  
  68.  
  69. ?>
Coloreado en 0.011 segundos, usando GeSHi 1.0.8.4


Una pregunta: cuando creo una cookie así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. if(setcookie("test","valor",time()+3600,"/","localhost",false,false)) {
  2. echo "yeah";
  3. }
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4


Uso el $_COOKIE['test'] pero nunca la encuentra. Me dice index no válido, la veo creada con un addon de Firefox pero mi PHP no la encuentra. ¿ Cuál es el error ? ¿ La ruta ?