2015-02-06 105 views
0

再次提出此问题的歉意。我已经看到了这个问题的其他答案,但坦率地说,我很糟糕的regexing我无法弄清楚如何完全使用这些解决方案来解决我自己的问题已弃用preg_replace():/ e修饰符已弃用,请使用preg_replace_callback而不是

这是我的代码,有麻烦的。

$features = preg_replace('!s:(\d+):"(.*?)";!es', "'s:'.strlen('$2').':\"$2\";'", $features); 
+3

哪些具体困难?你想达到什么目的? – wallyk 2015-02-06 15:57:05

+0

看起来你想要序列化或操纵一个序列化的var? – AbraCadaver 2015-02-06 16:04:58

回答

0
$features = preg_replace_callback('!s:(\d+):"(.*?)";!s', function($c) { 
    return serialize($c[2]); 
}, $features); 

当 - /凡有史以来的图案在源($特征中的例子)相匹配的回调被调用并且所有捕获被作为阵列(在示例$ c)中通过。
$ c [0]是完全匹配,$ c [1]是第一个子捕获(字符串\d+),$ c [2]秒子捕获(匹配.*?的字符串)。
完整的匹配被回调函数返回。
看看这个例子:

<?php 
echo "\r\n\r\n-------- example #1 --------\r\n"; 
$src = '1a2b3c'; 
$result = preg_replace_callback('!\d!', function($c) { 
    cprint($c); 
    $retval = $c[0]+22; 
    echo ' cb returns: ', $retval, "\r\n"; 
    return $retval; 
}, $src); 
echo 'result: ', $result, "\r\n"; 


echo "\r\n\r\n-------- example #2 --------\r\n"; 
$src = '1a2b3c4a5b6'; 
$result = preg_replace_callback('!(\d)a(\d)!', function($c) { 
    cprint($c); 

    $retval = sprintf('%dA%d', $c[1]+22, $c[2]+33); 
    echo ' cb returns: ', $retval, "\r\n"; 
    return $retval; 
}, $src); 
echo 'result: ', $result, "\r\n"; 



function cprint(array $c) { 
    echo 'callback invoked 
    $c=', preg_replace('!\s+!', ' ', var_export($c, true)), "\r\n"; 
} 

打印

-------- example #1 -------- 
callback invoked 
    $c=array (0 => '1',) 
    cb returns: 23 
callback invoked 
    $c=array (0 => '2',) 
    cb returns: 24 
callback invoked 
    $c=array (0 => '3',) 
    cb returns: 25 
result: 23a24b25c 


-------- example #2 -------- 
callback invoked 
    $c=array (0 => '1a2', 1 => '1', 2 => '2',) 
    cb returns: 23A35 
callback invoked 
    $c=array (0 => '4a5', 1 => '4', 2 => '5',) 
    cb returns: 26A38 
result: 23A35b3c26A38b6 
+0

你能否用你的答案附上几行解释它是如何工作的,因为OP明确表示他“在regexing上太糟糕了”:)? – 2015-02-06 18:55:16

+0

非常感谢你,似乎已经完全解决了这个问题,非常感谢。莫滕詹森说一点点解释会很棒。谢谢 – 2015-02-06 21:23:56