是否有可能压缩重叠的替代品?

时间:2014-05-23 05:00:12

标签: php regex

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

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

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

是否可以在一个周期内完成相同的操作(不一定是在PHP中)?

这个问题相当理论化。我想知道,如果有一种方法只需一次更换即可。

1 个答案:

答案 0 :(得分:1)

直接在正则表达式中无法做到这一点。

但你可以用回调函数来做到这一点:

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}"}'
);

结果:{"fruits" : ["lemon", "banana", "apple"]}