再次提出这个问题的道歉。我已经看到了这个问题的其他一些答案,但坦率地说,我在regexing上如此糟糕,我无法弄清楚如何准确地使用这些解决方案来解决我自己的问题
这是我的代码,我遇到了麻烦。
$features = preg_replace('!s:(\d+):"(.*?)";!es', "'s:'.strlen('$2').':\"$2\";'", $features);
答案 0 :(得分:0)
$features = preg_replace_callback('!s:(\d+):"(.*?)";!s', function($c) {
return serialize($c[2]);
}, $features);
当 - 或者在源中的模式匹配时(示例中的$ features),调用回调并且所有捕获都作为数组传递(示例中为$ c)。
$ c [0]是完全匹配,$ c [1]是第一个子捕获(maches \d+
的字符串),$ c [2]秒子捕获(匹配{{1的字符串) }})。
完全匹配将被回调返回的任何内容替换
看一下这个例子:
.*?
打印
<?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";
}