php将preg_replace转换为preg_replace_callback

时间:2016-02-08 21:24:23

标签: php regex preg-replace pcre preg-replace-callback

我正在研究这个旧代码,并遇到了这个问题 - 它失败了:

preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $sObject);

它告诉我不推荐使用preg_replace e修饰符,而是使用preg_replace_callback。

根据我的理解,我应该用一个回调函数替换's:'.strlen('$2').':\"$2\";'部分,该函数在匹配时进行替换。

我还没有得到,正是正在进行的正在进行的我将要取代的东西。将数据库字段中填充的php序列化数据(dumb,我知道......)与长度字段断开并修复它们以进行重新插入是一部分。

那么,任何人都可以解释这一点在做什么,或者我应该用它替换它?

1 个答案:

答案 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内的匿名函数。

以下为demos:后面的数字替换为$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";