是否有可能压缩重叠的替换


Is it possible to condense overlapping replacements?

这段代码用三个周期(使用三个正则表达式)重新格式化一个json字符串:

preg_replace (
    array ( '/([^"{]+?),/', '/([^"{ ]+?)}"/', '/"{"/'),
    array ( '"$1", ', '"$1"]', '["' ),
    '{"fruits" : "{lemon,banana,apple}"}');
result: {"fruits" : ["lemon", "banana", "apple"]}   

是否有可能在一个循环中做同样的事情(不一定在PHP中)?

这个问题相当理论性。我想知道,是否有一种方法可以在一次替换中做到这一点。

在正则表达式中不可能直接这样做。

但是你可以用一个回调函数来做:

preg_replace_callback(
    '/((?:"{|,)[^,}]+(?:}")?)/',
    function ($match) {
        if(substr($match[0],0,2) == '"{')
        { #first array element
            $ret = '["'.substr($match[0],2).'"';
        }elseif (substr($match[0], strlen($match[0])-2, 2) == '}"')
        { #last array element
            $ret = ', "'.substr($match[0],1,strlen($match[0])-3).'"]';
        }else{ #middle
            $ret = ', "'.substr($match[0],1).'"';
        }
        return $ret;
    },
    '{"fruits" : "{lemon,banana,apple}"}'
);

Result: {"fruits" : ["lemon", "banana", "apple"]}