2016-02-08 145 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

相關問題