Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何为preg_replace_callback()编写有效回调:需要参数2和x27';s:';。斯特伦(';$2';)';:&;引用$二,;“'';,_Php_Preg Replace Callback_Php 7.3 - Fatal编程技术网

Php 如何为preg_replace_callback()编写有效回调:需要参数2和x27';s:';。斯特伦(';$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

在我的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”)。:\“$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,非常感谢您的帮助。您删除正则表达式的第一个建议是正确的,没有更多错误,代码运行平稳。谢谢!还有您的第二个解决方案,新版本的代码也可以工作,没有错误,代码运行正常,谢谢!