PHP:序列化和反序列化包含转义字符的字符串

时间:2011-08-22 11:08:57

标签: php serialization escaping

如何正确序列化和反序列化包含转义字符的字符串?

假设:

$data = "\'test\'";
$out= serialize($data);
print_r($out); // ->  s:8:"\'test\'";

这里的问题是,unserialize:

不接受字符串长度
$out = 's:8:"\'test\'"';
var_dump(unserialize($out)); // -> bool(false)

但是如果我将字符串长度更改为6(忽略转义字符):

$out = 's:6:"\'test\'"';
var_dump(unserialize($out)); // -> string(6) "'test'"

它正确地反序列化。

处理这个问题的好方法是什么?

4 个答案:

答案 0 :(得分:5)

我会尝试在序列化数据之前调用base64_encode(),然后在反序列化数据后调用base64_decode()

$data = "\'test\'";
$out= serialize(base64_encode($data));
var_dump(base64_decode(unserialize($out))); // -> bool(false)

答案 1 :(得分:3)

问题是,PHP正在评估您的转义字符。如果你想保持它们完整,你也应该逃避它们:)例如:

$out = 's:8:"\'test\'"'; // $out = s:8:"'test'"
$out = 's:8:"\\\'test\\\'"'; // $out = s:8:"\'test\'"

var_dump(unserialize($out)); // string(8) "\'test\'" 

答案 2 :(得分:3)

你的测试用例不匹配,你在第一个例子中用双引号包装字符串,在第二个例子中用单引号包装,导致转义字符在字面意义上被用在后者中。

$out = '\'test\'';

不同
$data = "\'test\'";

如果你这样做

$data = "\'test\'";
$out= serialize($data);
print_r($out); // ->  s:8:"\'test\'";
$data = unserialize($out);
print_r($data); // -> \'test\'

它会起作用。

答案 3 :(得分:2)

请尝试json_encodejson_decode,而不是使用序列化和反序列化。后者会为你做(un)转义引号。