php将preg_replace转换为preg_replace_回调

php将preg_replace转换为preg_replace_回调,php,regex,preg-replace,pcre,preg-replace-callback,Php,Regex,Preg Replace,Pcre,Preg Replace Callback,我正在处理这段旧代码,遇到了以下问题-失败: preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $sObject); 它告诉我preg_replace修饰符已被弃用,而使用preg_replace_回调 据我所知,我应该替换的:'.strlen('$2')。:\“$2\”;'使用回调函数对匹配项进行替换 我不太明白的是,我将要替换的regexp正在做什么。将填充在数据库字段(dumb,我知道…)中的php序列

我正在处理这段旧代码,遇到了以下问题-失败:

preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $sObject);
它告诉我preg_replace修饰符已被弃用,而使用preg_replace_回调

据我所知,我应该替换
的:'.strlen('$2')。:\“$2\”;'使用回调函数对匹配项进行替换

我不太明白的是,我将要替换的regexp正在做什么。将填充在数据库字段(dumb,我知道…)中的php序列化数据与断开的长度字段结合起来,并修复它们以便重新插入,这是一部分工作

那么,有人能解释一下这个位在做什么,或者我应该用什么来代替它吗?

使用

preg_replace_callback('!s:(\d+):"(.*?)";!', function($m) {
      return 's:' . strlen($m[2]) . ':"' . $m[2] . '";';
}, $sObject);
!e
必须删除修饰符
$2
反向引用必须替换为
$m[2]
,其中
$m
是包含匹配值和子匹配的匹配对象,并传递给内部的匿名函数

下面是一个示例,其中
s:
后面的数字替换为
$m[2]
长度:

$sObject = 's:100:"word";';
$res = preg_replace_callback('!s:(\d+):"(.*?)";!', function($m) {
      return 's:' . strlen($m[2]) . ':"' . $m[2] . '";';
}, $sObject);
echo $res; // => s:4:"word";

尼斯-一个注意事项,因为outputI guess OP知道字符串不变性。我将添加一个演示。是的,我使用返回值作为输出。到目前为止,它似乎在做它的工作,这是正确的答案。代码的其他部分工作不正常,即我正在使用的序列化字符串似乎是多维数组。无论谁认为将序列化的php数据塞进数据库是个好主意,都应该挂起、刺伤、射击然后杀死!如何转换$content=preg\u replace('/\{([A-Z+)\}/e',“$1”,“$content”);要预存替换回调函数?@jonnydev无需回调,请删除
e