我尝试构建一个验证此类输入字符串的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';
}
答案 0 :(得分:1)
你不需要正则表达式。只需使用:
var_dump(json_decode($json, true));
答案 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
,如果缺少括号,也可以添加它们......
这里来得太晚了,所以我现在要睡觉了...我希望这个答案没有人们可以理解的错字和句子。如果是,我道歉。