我正在研究这个旧代码,并遇到了这个问题 - 它失败了:
preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $sObject);
它告诉我不推荐使用preg_replace e修饰符,而是使用preg_replace_callback。
根据我的理解,我应该用一个回调函数替换's:'.strlen('$2').':\"$2\";'
部分,该函数在匹配时进行替换。
我还没有得到,正是正在进行的正在进行的我将要取代的东西。将数据库字段中填充的php序列化数据(dumb,我知道......)与长度字段断开并修复它们以进行重新插入是一部分。
那么,任何人都可以解释这一点在做什么,或者我应该用它替换它?
答案 0 :(得分:6)
使用
preg_replace_callback('!s:(\d+):"(.*?)";!', function($m) {
return 's:' . strlen($m[2]) . ':"' . $m[2] . '";';
}, $sObject);
必须删除!e
修饰符。 $2
反向引用必须替换为$m[2]
,其中$m
是包含匹配值和子匹配的匹配对象,并传递给preg_replace_callback
内的匿名函数。
以下为demo,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";