如何在纯PHP中解析$#u服务器[';HTTP#u COOKIE';]?

如何在纯PHP中解析$#u服务器[';HTTP#u COOKIE';]?,php,cookies,Php,Cookies,我需要用纯PHP解析$\u服务器['HTTP\u COOKIE']字符串。我无法访问$\u COOKIE或http\u parse\u COOKIE(PECL)等函数 我尝试使用如下函数: function ParseCookies($strHeaders) { $result = array(); $aPairs = explode(';', $strHeaders); foreach ($aPairs as $pair) {

我需要用纯PHP解析$\u服务器['HTTP\u COOKIE']字符串。我无法访问$\u COOKIE或http\u parse\u COOKIE(PECL)等函数

我尝试使用如下函数:

function ParseCookies($strHeaders)
{
$result = array();              
    $aPairs = explode(';', $strHeaders);
    foreach ($aPairs as $pair)
    {
        $aKeyValues = explode('=', trim($pair), 2);
        if (count($aKeyValues) == 2)
        {
            switch ($aKeyValues[0])
            {
                case 'path':
                case 'domain':
                    $aTmp[trim($aKeyValues[0])] = urldecode(trim($aKeyValues[1]));
                    break;
                case 'expires':
                    $aTmp[trim($aKeyValues[0])] = strtotime(urldecode(trim($aKeyValues[1])));
                    break;
                default:
                    $aTmp['name'] = trim($aKeyValues[0]);
                    $aTmp['value'] = trim($aKeyValues[1]);
                    break;
            }
        }
        $result[] = $aTmp;
    }
return $result;
}
但是分解模式很简单,因为我可以有一个类似于
name=“a;b;c=1;”的cookie


我需要一些东西以正确的方式标记字符串。有什么想法吗?

一些改进,但不是代币

Class CookieParser{
    public $cookies = array();
    function __construct($str){
        foreach(explode('; ',$str) as $k => $v){
            preg_match('/^(.*?)=(.*?)$/i',trim($v),$matches);
            $this->cookies[trim($matches[1])] = urldecode($matches[2]);
        }
    }
}

$CP = new CookieParser($_SERVER['HTTP_COOKIE']);
print_r($CP->cookies);

一些改进,但不是代币

Class CookieParser{
    public $cookies = array();
    function __construct($str){
        foreach(explode('; ',$str) as $k => $v){
            preg_match('/^(.*?)=(.*?)$/i',trim($v),$matches);
            $this->cookies[trim($matches[1])] = urldecode($matches[2]);
        }
    }
}

$CP = new CookieParser($_SERVER['HTTP_COOKIE']);
print_r($CP->cookies);

一些改进,但不是代币

Class CookieParser{
    public $cookies = array();
    function __construct($str){
        foreach(explode('; ',$str) as $k => $v){
            preg_match('/^(.*?)=(.*?)$/i',trim($v),$matches);
            $this->cookies[trim($matches[1])] = urldecode($matches[2]);
        }
    }
}

$CP = new CookieParser($_SERVER['HTTP_COOKIE']);
print_r($CP->cookies);

一些改进,但不是代币

Class CookieParser{
    public $cookies = array();
    function __construct($str){
        foreach(explode('; ',$str) as $k => $v){
            preg_match('/^(.*?)=(.*?)$/i',trim($v),$matches);
            $this->cookies[trim($matches[1])] = urldecode($matches[2]);
        }
    }
}

$CP = new CookieParser($_SERVER['HTTP_COOKIE']);
print_r($CP->cookies);

要分析
Cookie的原始值:
,例如

datr=xxx; expires=Wed, 10-Feb-2021 03:05:45 GMT; Max-Age=63071999; path=/; domain=.facebook.com; secure; httponly
如果PHP非常简单,请使用:

您可能会注意到,但是我们甚至不需要担心
后面的空间。此外,parse_str将执行urldecode

请注意cookie名称中的点(.)和空格()将被下划线(389;)替换。就像。即使允许点(.)

配对功能将是:

echo http_build_query($cookies, '', '; ', PHP_QUERY_RFC3986);
它将转换回原始cookie字符串,但空格将被编码为%20

编辑: 如果您需要保留多个同名cookie:

function parse_cookie($str) {
    $cookies = array();
    $tok     = strtok($str, ';');
    while ($tok !== false) {
        $a                       = sscanf($tok, "%[^=]=%[^;]");
        $cookies[ltrim($a[0])][] = urldecode($a[1]);
        $tok                     = strtok(';');
    }
    return $cookies;
}

$str = 'datr=xxx; datr=yyy; datr=zzz; expires=Wed, 10-Feb-2021 03:05:45 GMT; Max-Age=63071999; path=/; domain=.facebook.com; secure; httponly';
print_r(parse_cookie($str));

Array
(
    [datr] => Array
        (
            [0] => xxx
            [1] => yyy
            [2] => zzz
        )

    [expires] => Array
        (
            [0] => Wed, 10-Feb-2021 03:05:45 GMT
        )

    [Max-Age] => Array
        (
            [0] => 63071999
        )

    [path] => Array
        (
            [0] => /
        )

    [domain] => Array
        (
            [0] => .facebook.com
        )

    [secure] => Array
        (
            [0] => 
        )

    [httponly] => Array
        (
            [0] => 
        )

)

要分析
Cookie的原始值:
,例如

datr=xxx; expires=Wed, 10-Feb-2021 03:05:45 GMT; Max-Age=63071999; path=/; domain=.facebook.com; secure; httponly
如果PHP非常简单,请使用:

您可能会注意到,但是我们甚至不需要担心
后面的空间。此外,parse_str将执行urldecode

请注意cookie名称中的点(.)和空格()将被下划线(389;)替换。就像。即使允许点(.)

配对功能将是:

echo http_build_query($cookies, '', '; ', PHP_QUERY_RFC3986);
它将转换回原始cookie字符串,但空格将被编码为%20

编辑: 如果您需要保留多个同名cookie:

function parse_cookie($str) {
    $cookies = array();
    $tok     = strtok($str, ';');
    while ($tok !== false) {
        $a                       = sscanf($tok, "%[^=]=%[^;]");
        $cookies[ltrim($a[0])][] = urldecode($a[1]);
        $tok                     = strtok(';');
    }
    return $cookies;
}

$str = 'datr=xxx; datr=yyy; datr=zzz; expires=Wed, 10-Feb-2021 03:05:45 GMT; Max-Age=63071999; path=/; domain=.facebook.com; secure; httponly';
print_r(parse_cookie($str));

Array
(
    [datr] => Array
        (
            [0] => xxx
            [1] => yyy
            [2] => zzz
        )

    [expires] => Array
        (
            [0] => Wed, 10-Feb-2021 03:05:45 GMT
        )

    [Max-Age] => Array
        (
            [0] => 63071999
        )

    [path] => Array
        (
            [0] => /
        )

    [domain] => Array
        (
            [0] => .facebook.com
        )

    [secure] => Array
        (
            [0] => 
        )

    [httponly] => Array
        (
            [0] => 
        )

)

要分析
Cookie的原始值:
,例如

datr=xxx; expires=Wed, 10-Feb-2021 03:05:45 GMT; Max-Age=63071999; path=/; domain=.facebook.com; secure; httponly
如果PHP非常简单,请使用:

您可能会注意到,但是我们甚至不需要担心
后面的空间。此外,parse_str将执行urldecode

请注意cookie名称中的点(.)和空格()将被下划线(389;)替换。就像。即使允许点(.)

配对功能将是:

echo http_build_query($cookies, '', '; ', PHP_QUERY_RFC3986);
它将转换回原始cookie字符串,但空格将被编码为%20

编辑: 如果您需要保留多个同名cookie:

function parse_cookie($str) {
    $cookies = array();
    $tok     = strtok($str, ';');
    while ($tok !== false) {
        $a                       = sscanf($tok, "%[^=]=%[^;]");
        $cookies[ltrim($a[0])][] = urldecode($a[1]);
        $tok                     = strtok(';');
    }
    return $cookies;
}

$str = 'datr=xxx; datr=yyy; datr=zzz; expires=Wed, 10-Feb-2021 03:05:45 GMT; Max-Age=63071999; path=/; domain=.facebook.com; secure; httponly';
print_r(parse_cookie($str));

Array
(
    [datr] => Array
        (
            [0] => xxx
            [1] => yyy
            [2] => zzz
        )

    [expires] => Array
        (
            [0] => Wed, 10-Feb-2021 03:05:45 GMT
        )

    [Max-Age] => Array
        (
            [0] => 63071999
        )

    [path] => Array
        (
            [0] => /
        )

    [domain] => Array
        (
            [0] => .facebook.com
        )

    [secure] => Array
        (
            [0] => 
        )

    [httponly] => Array
        (
            [0] => 
        )

)

要分析
Cookie的原始值:
,例如

datr=xxx; expires=Wed, 10-Feb-2021 03:05:45 GMT; Max-Age=63071999; path=/; domain=.facebook.com; secure; httponly
如果PHP非常简单,请使用:

您可能会注意到,但是我们甚至不需要担心
后面的空间。此外,parse_str将执行urldecode

请注意cookie名称中的点(.)和空格()将被下划线(389;)替换。就像。即使允许点(.)

配对功能将是:

echo http_build_query($cookies, '', '; ', PHP_QUERY_RFC3986);
它将转换回原始cookie字符串,但空格将被编码为%20

编辑: 如果您需要保留多个同名cookie:

function parse_cookie($str) {
    $cookies = array();
    $tok     = strtok($str, ';');
    while ($tok !== false) {
        $a                       = sscanf($tok, "%[^=]=%[^;]");
        $cookies[ltrim($a[0])][] = urldecode($a[1]);
        $tok                     = strtok(';');
    }
    return $cookies;
}

$str = 'datr=xxx; datr=yyy; datr=zzz; expires=Wed, 10-Feb-2021 03:05:45 GMT; Max-Age=63071999; path=/; domain=.facebook.com; secure; httponly';
print_r(parse_cookie($str));

Array
(
    [datr] => Array
        (
            [0] => xxx
            [1] => yyy
            [2] => zzz
        )

    [expires] => Array
        (
            [0] => Wed, 10-Feb-2021 03:05:45 GMT
        )

    [Max-Age] => Array
        (
            [0] => 63071999
        )

    [path] => Array
        (
            [0] => /
        )

    [domain] => Array
        (
            [0] => .facebook.com
        )

    [secure] => Array
        (
            [0] => 
        )

    [httponly] => Array
        (
            [0] => 
        )

)

真的很喜欢@Andrej的回答。。。但是我想要一个函数(不是类)和一个可以保存多个同名cookie的东西。。。这些答案中没有一个当前可以执行,因为您不能使用具有多个相同名称键的关联数组

函数CookieParser($str){
$cookies=array();
foreach(分解(“;”,$str)为$k=>$v){
预匹配('/^(.*?=(.*?$/i',修剪($v),$matches);
array_push($cookies,array(trim($matches[1]),urldecode($matches[2]));
}
退回$cookies;
}
$CP=CookieParser($_服务器['HTTP_COOKIE']);
生产:
排列
(
[0]=>阵列
(
[0]=>用户名
[1] =>管理员
)
[1] =>阵列
(
[0]=>第页
[1] => 5
)
[2] =>阵列
(
[0]=>第页
[1] => 9
)

)
非常喜欢@Andrej的回答。。。但是我想要一个函数(不是类)和一个可以保存多个同名cookie的东西。。。这些答案中没有一个当前可以执行,因为您不能使用具有多个相同名称键的关联数组

函数CookieParser($str){
$cookies=array();
foreach(分解(“;”,$str)为$k=>$v){
预匹配('/^(.*?=(.*?$/i',修剪($v),$matches);
array_push($cookies,array(trim($matches[1]),urldecode($matches[2]));
}
退回$cookies;
}
$CP=CookieParser($_服务器['HTTP_COOKIE']);
生产:
排列
(
[0]=>阵列
(
[0]=>用户名
[1] =>管理员
)
[1] =>阵列
(
[0]=>第页
[1] => 5
)
[2] =>阵列
(
[0]=>第页
[1] => 9
)

)
非常喜欢@Andrej的回答。。。但是我想要一个函数(不是类)和一个可以保存多个同名cookie的东西。。。这些答案中没有一个当前可以执行,因为您不能使用具有多个相同名称键的关联数组

函数CookieParser($str){
$cookies=array();
foreach(分解(“;”,$str)为$k=>$v){
预匹配('/^(.*?=(.*?$/i',修剪($v),$matches);
array_push($cookies,array(trim($matches[1]),urldecode($matches[2]));
}
退回$cookies;
}
$CP=CookieParser($_服务器['HTTP_COOKIE']);
生产:
排列
(
[0]=>阵列
(
[0]=>用户名
[1] =>管理员
)
[1] =>阵列
(
[0]=>第页
[1] => 5
)
[2] =>阵列
(
[0]=>第页
[1] => 9
)

)
非常喜欢@Andrej的回答。。。但是我想要一个函数(不是类)和一个可以保存多个同名cookie的东西。。。这些答案中没有一个当前可以执行,因为您不能使用具有多个相同名称键的关联数组

函数CookieParser($str){
$cookies=array();
foreach(分解(“;”,$str)为$k=>$v){
预匹配('/^(.*?=(.*?$/i',修剪($v),$matches);
array_push($cookies,array(trim($matches[1]),urldecode($matches[2]));
}
退回$cookies;
}
$CP=CookieParser($_服务器['HTTP_COOKIE']);
生产:
排列
(
[0]=>阵列
(
[0]=>用户名