php 将 preg_replace 转换为 preg_replace_callback

php converting preg_replace to preg_replace_callback

我正在处理这个旧代码,运行 跨过这个 - 但失败了:

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

它告诉我 preg_replace e 修饰符已弃用,应改用 preg_replace_callback。

据我所知,我应该用一个回调函数来替换 's:'.strlen('').':\"\";' 部分,该回调函数会在比赛中进行替换。

我不太明白的是我将要替换的正则表达式的作用。将 php 填充在数据库字段中的序列化数据(愚蠢,我知道......)与损坏的长度字段并修复它们以重新插入是有点的一部分。

那么谁能解释一下那个位在做什么,或者我应该用什么来替换它?

使用

preg_replace_callback('!s:(\d+):"(.*?)";!', function($m) {
      return 's:' . strlen($m[2]) . ':"' . $m[2] . '";';
}, $sObject);

必须删除 !e 修饰符。 </code> 反向引用必须替换为 <code>$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";