php编码cookie值编码

时间:2011-08-22 20:08:27

标签: php cookies encoding character-encoding urlencode

我有一些原始的饼干。基本上是这样的块:

    $block_simple = 'amsterdam=^a2p=4e52bafe90000000000.^sfLMD=1144330254^sbf=#c0000000a0000000004^cos=5^cv=15555^sin=in^js=1^dv=4e52b496^;     dp1=bpcid/1907355535033e818^a1p/04e540618^fm/5.3.24e7a1bc1^kms/in52151b98^pbf/#80000000045033e818^mpc/0|34e5fe398^reg/^flagReg=1^52151b98^tzo/-3c52151b96^u1p/Y2xlbW8xMDQ35033e818^u1f/bill5033e818^idm/14e568347^; cssg=f27d4a5f1310a47ac5c0d1b0ffe1e901; nonsession=BAQAAATHFlnoQAAaAAEAACVAz6BhjbGVtbzEwNDcABAAJUDPCQWNsZW1vMTA0NwFkAAJQM gYIzIAygAgV7i2GGYyN2Q0YTVmMTMxMGE0N2FjNWMwZDFiMGZmZTFlOTAxAKoAAVAz6BgwAMsAAk5Su6A4MgFMABhQM gYNGU1MmI0OTguMC4xLjIuMTA3LjQuMC4zAU0AF1Az6Bg0ZTUyYjQ2Ny4wLjEuMy40MC4wLjAuMwAQAAlQM gYY2xlbW8xMDQ3ADMAC1Az6BhCQTIgOEpRLEdCUgDzACJQM gYJDIkbG9FSFZIa2ckejFOaDdjZTE4NWpKTENJWXpHemRrMQCaAApOU BBY2xlbW8xMDQ3aACcADhQM gYblkrc0haMlByQm1kajZ3Vm5ZK3NFWjJQckEyZGo2d0drSVdvQzVLR3FRdWRqNng5blkrc2VRPT0AnQAIUDPoGDAwMDAwMDAxM5dSPx0CaJX1ZoMRrBnZ/7dgQSM*; cid=8jLVETzyhohsSktA#190735553; npii=btrm/svid=572133042035033e6be^tguid/f27d4a5f1310a47ac5c0d1b0ffe1e9015033e6be^cguid/f27d65741310a47a26f398e3fe7999045033e6be^; lucky9=2524611; ds1=ats/1314038674493; secses=BAQAAATHFlnoQAAaAAUsAF1Az6Bg0ZTUyYjQ5OC4wLjEuMi44OS40LjAuM70LVKpcj67yqpxdXqgT56WI5Ov ; ds2=ssts/1314043029160^';

我需要在像这样的块中转换它们


     $block_coded = 'amsterdam=%5Ea2p%3D4e52bafe90000000000.%5EsfLMD%3D1144330254%5Esbf%3D%23c0000000a0000100004%5Ecos%3D5%5Ecv%3D15555%5Esin%3Din%5Ejs%3D1%5Edv%3D4e52b464%5E; dp1=bpcid/1907355535033e7e7^a1p/04e5405e7^fm/5.3.24e7a1bc1^kms/in52151b67^pbf/%2380000000045033e7e7^mpc/0%7C34e5fe367^reg/%5EflagReg%3D1%5E57bb58e5^tzo/-3c52151b64^u1p/Y2xlbW8xMDQ35033e7e7^idm/14e568347^u1f/bill5033e7e7^; cssg=f27d4a5f1310a47ac5c0d1b0ffe1e901; s=BAQAAATHFlnoQAAWAAAEACU5T9RJjbGVtbzEwNDcAEgAKTlQF53Rlc3RDb29raWUAAwAFTlQF5zE2Mzg0APQAIk5UBeckMiRsb0VIVkhrZyR6MU5oN2NlMTg1akpMQ0lZekd6ZGsxAWUAAk5UBecjMgFFAAhQM+fnNDM3ZWRjNzUABgABTlQF5zAAqAABTlP1EjEA+AAgTlQF52YyN2Q0YTVmMTMxMGE0N2FjNWMwZDFiMGZmZTFlOTAxAUoAGE5UBec0ZTUyYjJjOS4wLjEuMi4xMDkuNC4wLjMADAAJTlQF5zIwNzkzMjQ4NwA9AAlOVAXnY2xlbW8xMDQ3euTn0ezKbK6+M6o3TtjWa5K1jLQ*; nonsession=BAQAAATHFlnoQAAaAAEAACVAz5+djbGVtbzEwNDcABAAJUDPCQWNsZW1vMTA0NwFkAAJQM+fnIzIAqgABUDPn5zAAygAgV7i152YyN2Q0YTVmMTMxMGE0N2FjNWMwZDFiMGZmZTFlOTAxAMsAAk5Su284MQFMABhQM+fnNGU1MmI0NjcuMC4xLjIuMTA3LjQuMC4zAU0AF1Az5+c0ZTUyYjQ2Ny4wLjEuMy40MC4wLjAuMwAQAAlQM+fnY2xlbW8xMDQ3ADMAC1Az5+dCQTIgOEpRLEdCUgDzACJQM+fnJDIkbG9FSFZIa2ckejFOaDdjZTE4NWpKTENJWXpHemRrMQCaAApOU+BBY2xlbW8xMDQ3aACcADhQM+fnblkrc0haMlByQm1kajZ3Vm5ZK3NFWjJQckEyZGo2d0drSVdvQzVLR3FRdWRqNng5blkrc2VRPT0AnQAIUDPn5zAwMDAwMDAxYMkmH+tedAVimO9p45ia+VNV6Wg*; cid=8jLVETzyhohsSktA%23190735553; npii=btrm/svid%3D572133042035033e6be^tguid/f27d4a5f1310a47ac5c0d1b0ffe1e9015033e6be^cguid/f27d65741310a47a26f398e3fe7999045033e6be^; lucky9=2524611; ds1=ats/1314038674493; ns1=BAQAAATHFlnoQAAaAAKUADFAz5+cyMDc5MzI0ODcvMDtGXDKnc1RHs8+T/0pDNtDJKyP2xQ**; secses=BAQAAATHFlnoQAAaAAUsAF1Az5+c0ZTUyYjQ2Ny4wLjEuMi44OS40LjAuM9lRXjfUdgATs53TH5Qcyhx8OdqF; shs=BAQAAATHFlnoQAAaAAVUADk5b3hIyMDYyNDU1NzAwMDMsMSg9MHLlFoepc4NzCZHM8McIjWiy; ds2=ssts/1314043024564^';

我甚至不确定第二个块使用了什么加密/编码方法,因为它非常奇怪。我的要求是直截了当的解决方案。

**UPDATE: arnaud576875 Provided a solution 
function urlencode_cb($matches) {
    return $matches[1] . rawurlencode($matches[2]);
}
$block_coded = preg_replace_callback('#(\w+?=)([^\s;]+)\s*#', 'urlencode_cb', $block_simple);

但它并不适用于所有的块(实际上没有50%的块)。以下是上述功能无效的示例。

 $block_simple ='amsterdam=^a2p=4e53c10790000000000.^lrtjs=1.1^sfLMD=1144330254^sbf=#c0000000a0008000004^cos=5^cv=15555^sin=in^lvmn=2|0|130519409054|180712051981|^js=1^dv=4e53c023^; dp1=bvrvi/0|0|4e60ef26^pcid/1907355535034f3a6^a1p/04e5511a6^fm/5.3.24e7a1bc1^kms/in52162726^pbf/#6000000088000000045034f3a6^mpc/0|34e60ef26^reg/^flagReg=1^52162726^tzo/-3c52162723^u1p/Y2xlbW8xMDQ35034f3a6^idm/14e568347^u1f/bill5034f3a6^; cssg=f27d4a5f1310a47ac5c0d1b0ffe1e901; nonsession=BAQAAATHFlnoQAAaAAEAACVA086ZjbGVtbzEwNDcABAAJUDPCQWNsZW1vMTA0NwFkAAJQNPOmIzIACAAcTntNJjEzMTQxMDkzMDR4MTMwNTE5NDA5MDU0eDB4Mk4AqgABUDTzpjAAygAgV7nBpmYyN2Q0YTVmMTMxMGE0N2FjNWMwZDFiMGZmZTFlOTAxAMsAA05Txy4xNDMBTAAYUDTzpjRlNTNjMDI2LjAuMS4yLjEwNy40LjAuMwFNABdQNPOmNGU1M2I3OGMuMC4xLjMuNDAuMC4wLjMAEAAJUDTzpmNsZW1vMTA0NwAzAAtQNPOmQkEyIDhKUSxHQlIA8wAiUDTzpiQyJGxvRUhWSGtnJHoxTmg3Y2UxODVqSkxDSVl6R3pkazEAmgAKTlPgQWNsZW1vMTA0N2gAnAA4UDTzpm5ZK3NIWjJQckJtZGo2d1ZuWStzRVoyUHJBMmRqNndHa0lXb0M1S0dxUXVkajZ4OW5ZK3NlUT09AJ0ACFA086YwMDAwMDAwMardeUkKMs4Os7ChwB6XUI1HBogs; cid=8jLVETzyhohsSktA#190735553; npii=btrm/svid=572133042035034eabb^cguid/f27d65741310a47a26f398e3fe7999045034eabb^tguid/f27d4a5f1310a47ac5c0d1b0ffe1e9015034eabb^; lucky9=2524611; ds1=ats/1314038674493; secses=BAQAAATHFlnoQAAaAAUsAF1A086Y0ZTUzYzAyNi4wLjEuMi44OS41LjAuMxLtD8ybEPsI/sx10s7RA5 bEe8A; ds2=ssts/1314111522013^';
$block_coded='amsterdam=%5Ea2p%3D4e53c10790000000000.%5Elrtjs%3D1.1%5EsfLMD%3D1144330254%5Esbf%3D%23c0000000a0008100004%5Ecos%3D5%5Ecv%3D15555%5Elvmn%3D2%7C0%7C130519409054%7C180712051981%7C%5Esin%3Din%5Ejs%3D1%5Edv%3D4e53bfa6%5E; dp1=bvrvi/0%7C0%7C4e60eeaa^pcid/1907355535034f32a^a1p/04e55112a^fm/5.3.24e7a1bc1^pbf/%236000000088000000045034f32a^mpc/0%7C34e60eeaa^kms/in521626aa^reg/%5EflagReg%3D1%5E57bc6427^tzo/-3c521626a6^u1p/Y2xlbW8xMDQ35034f32a^u1f/bill5034f32a^idm/14e568347^; cssg=f27d4a5f1310a47ac5c0d1b0ffe1e901; s=BAQAAATHFlnoQAAWAAAEACU5T9RJjbGVtbzEwNDcAAwAFTlURKjE2Mzg0AUUACFA08yo0MzdlZGM3NQFlAAJOVREqIzIABgABTlURKjAAqAABTlP1EjEBSgAYTlURKjRlNTNiZmFhLjAuMS4yLjEwOS41LjAuMwAMAAlOVREqMjA3OTMyNDg3AO4AF05VESowBmh0dHA6Ly93d3cuZWJheS5jb20vBwASAApOVREqdGVzdENvb2tpZQD0ACJOVREqJDIkbG9FSFZIa2ckejFOaDdjZTE4NWpKTENJWXpHemRrMQD4ACBOVREqZjI3ZDRhNWYxMzEwYTQ3YWM1YzBkMWIwZmZlMWU5MDEAPQAJTlURKmNsZW1vMTA0N5ldduI42WNQc0BpBDVJ17THzygM; nonsession=BAQAAATHFlnoQAAaAAEAACVA08ypjbGVtbzEwNDcABAAJUDPCQWNsZW1vMTA0NwFkAAJQNPMqIzIACAAcTntMqjEzMTQxMDkzMDR4MTMwNTE5NDA5MDU0eDB4Mk4AygAgV7nBKmYyN2Q0YTVmMTMxMGE0N2FjNWMwZDFiMGZmZTFlOTAxAKoAAVA08yowAMsAA05TxrIxNDIBTAAYUDTzKjRlNTNiZmFhLjAuMS4yLjEwNy40LjAuMwFNABdQNPMqNGU1M2I3OGMuMC4xLjMuNDAuMC4wLjMAEAAJUDTzKmNsZW1vMTA0NwAzAAtQNPMqQkEyIDhKUSxHQlIA8wAiUDTzKiQyJGxvRUhWSGtnJHoxTmg3Y2UxODVqSkxDSVl6R3pkazEAmgAKTlPgQWNsZW1vMTA0N2gAnAA4UDTzKm5ZK3NIWjJQckJtZGo2d1ZuWStzRVoyUHJBMmRqNndHa0lXb0M1S0dxUXVkajZ4OW5ZK3NlUT09AJ0ACFA08yowMDAwMDAwMaIuK/YCex+5DdAYEm4BqgIwoGfu; cid=8jLVETzyhohsSktA%23190735553; npii=btrm/svid%3D572133042035034eabb^cguid/f27d65741310a47a26f398e3fe7999045034eabb^tguid/f27d4a5f1310a47ac5c0d1b0ffe1e9015034eabb^; lucky9=2524611; ds1=ats/1314038674493; ns1=BAQAAATHFlnoQAAaAAKUADFA08yoyMDc5MzI0ODcvMDusUc6LAcEB+oxRkYBCNdqXjlbT6A**; secses=BAQAAATHFlnoQAAaAAUsAF1A08yo0ZTUzYmZhYS4wLjEuMi44OS41LjAuM8+VafwG8wCngDZdwt073uO7PTRH; shs=BAQAAATHFlnoQAAaAAVUADk5b3hIyMDYyNDU1NzAwMDMsMSg9MHLlFoepc4NzCZHM8McIjWiy; ds2=ssts/1314111517271^';

3 个答案:

答案 0 :(得分:0)

你可以使用rawurlencodeurlencode(它们之间的唯一区别是第二个也编码“〜”字符)

http://php.net/manual/en/function.rawurlencode.php

http://php.net/manual/en/function.urlencode.php

答案 1 :(得分:0)

我认为您希望对每个值应用rawurlencode。你可以这样做:

$cookies = preg_split('/[; ]+/', $block_coded, -1, PREG_SPLIT_NO_EMPTY);
foreach ($cookies as &$cookie) {
    list($name, $value) = explode('=', $cookie, 2);
    $cookie = $name.'='.rawurlencode($value);
}
$block_coded = implode('; ', $cookies);

答案 2 :(得分:0)

我的php cookie值编码功能:

<?
function encode_cookie_value($value)
         {return strtr($value,
                       array_combine(str_split($tmp=",; \t\r\n\013\014"),
                                     array_map('rawurlencode', str_split($tmp))
                                    )
                      );
         }
setrawcookie('kk', encode_cookie_value('jk=jk?jk-/":jk;jk jk,jk'));
?>