[PHP]将JSON模型的数据,替换成JSON数据

看小雪 2012-04-30 08:40:40
{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的话,不行呀,必须得是一个一维数组。

请教各位大侠。
...全文
224 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
看小雪 2012-04-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 2 楼 的回复:

楼上的,非常棒,是我要的结果。

想请问一下:用正则(?<={|,)[^:\s]*(?=:)这样来,不行吗??
当然可以

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


晕倒了,没想到$0也能用,当时我用的$1,死活过不去,就没想了。

吐血呀 -_-
看小雪 2012-04-30
  • 打赏
  • 举报
回复
你们写的都比我写的效率高,我的要回塑,效率大大折扣。

$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你的这个效率应该更高。
xuzuning 2012-04-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

楼上的,非常棒,是我要的结果。

想请问一下:用正则(?<={|,)[^:\s]*(?=:)这样来,不行吗??
[/Quote]当然可以

$json=preg_replace('/(?<={|,)[^:\s]*(?=:)/is', '"$0"',$json);
print_r(json_decode($json,true));
代码如诗 2012-04-30
  • 打赏
  • 举报
回复
还是老大威武
2楼的修改下就可以了 ({|,)([^:\s]*)(?=:)[Quote=引用 2 楼 的回复:]

楼上的,非常棒,是我要的结果。

想请问一下:用正则(?<={|,)[^:\s]*(?=:)这样来,不行吗??
[/Quote]
xuzuning 2012-04-30
  • 打赏
  • 举报
回复
$json=preg_replace('/(,|,?\s*?{)\b(\w+):/', '$1"$2":',$json);
print_r(json_decode($json,true));
看小雪 2012-04-30
  • 打赏
  • 举报
回复
楼上的,非常棒,是我要的结果。

想请问一下:用正则(?<={|,)[^:\s]*(?=:)这样来,不行吗??
代码如诗 2012-04-30
  • 打赏
  • 举报
回复
<?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]}\":";
}
正常输出数组 应该是你要的结果

21,882

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧