2个相同的字符串,一个在反序列化时出错,另一个没有。为什么?

时间:2016-03-04 13:17:20

标签: php serialization

以下是代码:

<?php
$txt = 'a:1:{s:14:"exclude_stores";a:3:{i:0;s:7:"phoenix";i:1;s:8:"chandler";i:2;s:6:"tucson";}}' //serialized PHP array

$str = htmlspecialchars(urldecode($txt));
$str = preg_replace('/\&lt;\?.*\?\&gt;/ims', '', $str); //get rid of php tags/code enclosed in <? ... >

$str = preg_replace('/\&gt;/ims', '>', $str); //change &gt; back to >
?>

此时,如果我这样做:

<?php
echo gettype($txt) . ' ' . $txt . '<br>';
echo gettype($str) . ' ' . $str;
?>

我明白了:

string a:1:{s:14:"exclude_stores";a:3:{i:0;s:7:"phoenix";i:1;s:8:"chandler";i:2;s:6:"tucson";}}

string a:1:{s:14:"exclude_stores";a:3:{i:0;s:7:"phoenix";i:1;s:8:"chandler";i:2;s:6:"tucson";}}

字符串看起来完全一样。如果我这样做:

<?php
$u1 = unserialize($txt);
print_r($u1);
$u2 = unserialize($str);
print_r($u2);
?>

我得到:     数组([exclude_stores] =&gt;数组([0] =&gt;凤凰[1] =&gt;钱德勒[2] =&gt;图森))

Notice: unserialize(): Error at offset 5 of 128 bytes in ...

有一些事情发生在$ str上,反序列化并不喜欢,但我无法弄清楚它是什么。在屏幕上,字符串看起来完全相同,当我将它们粘贴到N ++中时,它们看起来完全一样。

我怀疑htmlspecialchars,urldecode或preg_replace正在对我无法看到的文字做些什么。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

字符串不同,但它们在屏幕上显示相同,因为htmlspecialchars正在转换为re.search,这会在浏览器屏幕上呈现为“符号。

尝试从CLI运行脚本以查看我的意思

$ str等于:

&quot;

你可以看到为什么它不会反序列化:)