2015-02-06 107 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