Php 如何为preg_replace_callback()编写有效回调:需要参数2和x27';s:';。斯特伦(';$2';)';:&;引用$二,;“'';,
在我的config.php中,我有一个旧的PHP5函数,我试图更新它以在PHP7中使用,但这个错误和警告破坏了一切: PHP警告:preg_replace_callback():需要参数2“s:”.strlen(“$2”):“$2”,是一个有效的回调 有人能告诉我如何使它成为一个有效的回调吗?非常感谢你的帮助 缺少有效回调的函数是:Php 如何为preg_replace_callback()编写有效回调:需要参数2和x27';s:';。斯特伦(';$2';)';:&;引用$二,;“'';,,php,preg-replace-callback,php-7.3,Php,Preg Replace Callback,Php 7.3,在我的config.php中,我有一个旧的PHP5函数,我试图更新它以在PHP7中使用,但这个错误和警告破坏了一切: PHP警告:preg_replace_callback():需要参数2“s:”.strlen(“$2”):“$2”,是一个有效的回调 有人能告诉我如何使它成为一个有效的回调吗?非常感谢你的帮助 缺少有效回调的函数是: 函数uu非序列化($sObject){ $\u ret=preg\u replace\u回调(“!s:(\d+):”(.*);!”,“'s:”.strlen(“$2
函数uu非序列化($sObject){
$\u ret=preg\u replace\u回调(“!s:(\d+):”(.*);!”,“'s:”.strlen(“$2”)。:\“$2\”;”,$sObject);
返回未序列化($\u ret);
这段代码似乎很天真地试图修复序列化错误。每当我看到这一点时,总是因为有人盲目地执行数据库搜索和替换,而PHP对其存储格式非常挑剔
例如,我想说,看看你是否可以删除正则表达式,也许它不再需要了。看看你的日志,看看你是否看到任何通知
函数uu非序列化($sObject){
返回未序列化($sObject);
}
如果这不起作用,下面是一个对非常简单的对象起作用的版本,但需要注意一些注意事项:
函数uu非序列化($sObject)
{
$\uuuu ret=preg\u replace\u回调(
“!s:(?\d+):(?*?);!”,
静态函数($matches){
return's:'.strlen($matches['value'])。:“.$matches['value'].”;”;
},
$sObject
);
返回未序列化($\u ret);
}
这可以通过以下方式进行测试:
$obj=newstdclass();
$obj->test='test';
$before=序列化($obj);
$after=\u unserialize($before);
echo$before,PHP_EOL;
打印费($after);
在PHP中,字符串test
字符串序列化为:
s:4:“测试”
其中,第一个数字是字符串的长度,后跟实际字符串。如果长度不匹配,则情况会变得糟糕,这就是您的代码试图解决的问题。我说您的代码这样做很幼稚,因为存在无法处理的边缘情况,例如:
$obj=newstdclass();
$obj->test='test';
$before=序列化($obj);
$after=\u unserialize($before);
但是,如果它在过去起作用,可能这些边缘情况不存在。请参见Chris,非常感谢您的帮助。您删除正则表达式的第一个建议是正确的,没有更多错误,代码运行平稳。谢谢!还有您的第二个解决方案,新版本的代码也可以工作,没有错误,代码运行正常,谢谢!