2016-02-08 146 views
4

我工作的这个老代码,这对面跑 - 这失败:PHP转换的preg_replace到preg_replace_callback

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

它告诉我的preg_replace e修饰符已被弃用,而是要使用preg_replace_callback。

从我所了解的情况来看,我应该用一个回调函数代替's:'.strlen('$2').':\"$2\";'部分,该回调函数在匹配上进行替换。

我没有完全得到,正是正则表达式正在做的事情,我会替换。这是一个有点采取填充数据库字段(愚蠢,我知道......)与破碎的长度字段填入PHP序列化数据,并修复它们重新插入。

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

回答

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"; 
+0

尼斯 - 记为[使用preg_replace_callback的'的返回值()'](https://开头EVAL。在/ 515251)作为输出 –

+0

我猜OP知道字符串不变性。我将添加一个演示。 –

+0

是的,我使用返回值作为输出。 到目前为止,它看起来像是在做它的工作,而这是正确的答案。还有其他代码部分工作不正常,即我用串口连接的字符串似乎是多维数组。谁决定这是一个好主意,将串行化的PHP数据插入数据库应该被挂起,刺伤,击中然后死亡! – user1632874

相关问题