如何正确序列化和反序列化包含转义字符的字符串?
假设:
$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'"
它正确地反序列化。
处理这个问题的好方法是什么?
答案 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_encode
和json_decode
,而不是使用序列化和反序列化。后者会为你做(un)转义引号。