{data:[{code:"现货黄金",newPrice:"1662.3",hight:"0",low:"0",buy:"1662.3",sell:"r1663.3",zhang:"r4.75",date:"4:59:40",open:"0",close:"1657.55"}, {code:"香港黄金",newPrice:"15384",hight:"0",low:"0",buy:"15384",sell:"r15390",zhang:"r44",date:"2:59:55",open:"0",close:"15340"}, {code:"现货白银",newPrice:"31.25",hight:"0",low:"0",buy:"31.25",sell:"r31.31",zhang:"r0.17",date:"4:56:10",open:"0",close:"31.08"}, {code:"现货白金",newPrice:"1566.75",hight:"0",low:"0",buy:"1566.75",sell:"r1576.75",zhang:"r2.01",date:"3:29:35",open:"0",close:"1564.74"}, {code:"现货钯金",newPrice:"677.23",hight:"0",low:"0",buy:"677.23",sell:"r684.23",zhang:"r9.54",date:"3:29:35",open:"0",close:"667.69"}]}
大家看好了,这是具有一个JSON数据的模型,只是键名没有引号,所以json_decode会认为它是非法的JSON数据格式。现要用正则将它替换成,且加引号。/(?<={|,)[^:\s]*/is,目前能match出一个二维数据,但replace的话,不行呀,必须得是一个一维数组。请教各位大侠。

解决方案 »

  1.   

    <?php
    $json=<<<JSON
    {data:[{code:"现货黄金",newPrice:"1662.3",hight:"0",low:"0",buy:"1662.3",sell:"r1663.3",zhang:"r4.75",date:"4:59:40",open:"0",close:"1657.55"}, {code:"香港黄金",newPrice:"15384",hight:"0",low:"0",buy:"15384",sell:"r15390",zhang:"r44",date:"2:59:55",open:"0",close:"15340"}, {code:"现货白银",newPrice:"31.25",hight:"0",low:"0",buy:"31.25",sell:"r31.31",zhang:"r0.17",date:"4:56:10",open:"0",close:"31.08"}, {code:"现货白金",newPrice:"1566.75",hight:"0",low:"0",buy:"1566.75",sell:"r1576.75",zhang:"r2.01",date:"3:29:35",open:"0",close:"1564.74"}, {code:"现货钯金",newPrice:"677.23",hight:"0",low:"0",buy:"677.23",sell:"r684.23",zhang:"r9.54",date:"3:29:35",open:"0",close:"667.69"}]}
    JSON;$json=preg_replace_callback('/(,|,?\s*?{)\b(\w+):/','callback',$json);
    print_r(json_decode($json,true));function callback($v){
    return "{$v[1]}\"{$v[2]}\":";
    }正常输出数组 应该是你要的结果
      

  2.   

    楼上的,非常棒,是我要的结果。想请问一下:用正则(?<={|,)[^:\s]*(?=:)这样来,不行吗??
      

  3.   

    $json=preg_replace('/(,|,?\s*?{)\b(\w+):/', '$1"$2":',$json);
    print_r(json_decode($json,true));
      

  4.   

    当然可以$json=preg_replace('/(?<={|,)[^:\s]*(?=:)/is', '"$0"',$json);
    print_r(json_decode($json,true));
      

  5.   

    你们写的都比我写的效率高,我的要回塑,效率大大折扣。$pattern = '/(?<={|,)[^:\s]*(?=:)/is';
    $json=preg_replace_callback($pattern, 'callk',$str);function callk($v){
    return "\"$v[0]\"";
    }
    echo $json;
    print_r(json_decode($json,true));exit;我是参考了@Mr_merlin的写法,将我自个的改了下,也能用。不过,@xuzuning你的这个效率应该更高。