【发布时间】:2010-11-24 07:10:05
【问题描述】:
我的应用程序中有这个功能:
public function direct($theTree)
{
$aTreeRoot = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $theTree);
return unserialize($aTreeRoot);
}
它永远不应该返回 false,但在错误日志中不断发生的错误表明它返回 false。
但是,我无法在我的应用程序中复制错误。我正在尝试所有可能的方法,但它总是有效。
函数有问题吗?
$theTree 来自会话。
编辑: 正则表达式在那里是因为:unserialize - 在 cmets 中搜索我的正则表达式。它应该可以解决问题。
【问题讨论】:
-
这个
preg_replacing真的有必要吗?这个 Igor 字符给出的提示此解决方法的示例是一个完全无效的序列化字符串。我不知道任何需要这样做的错误。如果你的字符串是用serialize序列化的并且没有被修改,它应该unserialize就好了。你是自己遇到这个问题,还是因为“它应该解决一个问题”而把它放进去? -
@deceze:是的,没有那个正则表达式,反序列化不起作用。我将一个复杂的对象放入序列化的会话中,如果没有正则表达式,反序列化就会出现问题。正则表达式解决了这个问题,但似乎反序列化有时会返回 false。
-
三重检查您的序列化字符串在某处的途中没有拾取任何额外字符,更改编码等。您能举一个失败的例子吗?
-
我在序列化后将字符串从 Windows-1250 转换为 UTF-8。不确定这是否重要。
-
并且 window-1250 不是 UTF-8 的直接子集。某些字符可能会在编码中丢失。所以,先尝试简单的字符。
标签: php regex serialization