正则表达式将字符串json分解为值

时间:2012-04-29 19:56:30

标签: php regex

我尝试构建一个验证此类输入字符串的php正则表达式:

 {name:'something name here',type:'',id:''},{name:'other name',type:'small',id:34},{name:'orange',type:'weight',id:28}

等...

因此,它是一个json列表,每个包含3个字段:name,type,id.Field name始终存在,而type和id可以在一起为空字符串('')。然后,如果它具有有效的格式并获得json字符串数组,我可以用逗号对其进行爆炸。

我该怎么办?

更新 它不是一个有效的json,你可以说,但我有一个输入字段,用户放置标签,我想跟踪该标签的名称,类型和ID。 例: tag1(具有名称,类型,id),tags2(仅具有名称),tags3(具有名称,类型,id)。 所以,我认为我可以用这种格式发布一个字符串:

{'name':'test','type':'first','id':3},{'name':'other','type':'second','id':45}, etc

但我必须使用正则表达式验证此字符串。我能做到

$data = explode(',',$list);

然后我做:

foreach($data as $d){
  $tmp = json_decode($d);
  if($tmp == false) echo 'error invalid data'; 
}

2 个答案:

答案 0 :(得分:1)

你不需要正则表达式。只需使用:

var_dump(json_decode($json, true));

请参阅:http://us.php.net/manual/en/function.json-decode.php

答案 1 :(得分:1)

正如Gubo所指出的:这不是一个有效的JSON编码字符串。但是,如果要在脚本中处理的实际数据有效,那么您正在寻找正则表达式的错误树... PHP有大量函数可以比正则表达式更快地解析JSON字符串。

$string1 = "{name:'something name here',type:'',id:''},{name:'othername',type:'small',id:34},{name:'orange',type:'weight',id:28}";
$string2 = '[{"name":"something name here","type":"","id":""},{"name":"othername","type":"small","id":"34"},{"name":"orange","type":"weight","id":"28"}]';

其中$string2是有效JSON formar中的数据。如果您的数据是有效的JSON字符串,则以下代码就足够了:

$parsed = json_decode($string2);
//$parsed[0]['name'] return 'something name here'

但是,如果你正在处理无效的JSON字符串,那么事情会变得复杂一些......首先:如果你缺少你的对象属性(或者它们将在PHP中成为数组键),那么快速修复就是这样:

$parsed = json_decode('['.$string1.']');

如果你真的想分开解析它们:

$separated= preg_split('/(?<=[\}]),/',$string1);

但我不明白你为什么要那样做。这里最大的问题是属性字符串(或键)上没有引号。我已经整理了一个可以引用这些字符串的正则表达式(未经测试):

$parsed = json_decode(preg_replace('/(?<=[\{,])([a-z]+)/',str_replace('\'','"',$string1)));

请记住,最后一个正则表达式未经测试,因此它可能无法按预期执行...但它应该可以帮助您...在最后一个示例中,相同的规则适用于所有其他我给出的例子:如果引号和括号都在那里,只需使用json_decode,如果缺少括号,也可以添加它们......

这里来得太晚了,所以我现在要睡觉了...我希望这个答案没有人们可以理解的错字和句子。如果是,我道歉。