0

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

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

ETC...

因此,它是一个 json 列表,每个包含 3 个字段:名称、类型、id。字段名称始终存在,而 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'; 
}
4

2 回答 2

1

You don't need a regex for that. Just use this:

var_dump(json_decode($json, true));

See: http://us.php.net/manual/en/function.json-decode.php

于 2012-04-29T20:54:12.283 回答
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 格式的数据在哪里。如果您的数据是有效的 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,如果括号丢失,也添加它们......

这里已经很晚了,所以我现在要睡觉了......我希望这个答案没有包含错字和没人能理解的句子。如果是的话,我很抱歉。

于 2012-04-29T21:09:41.197 回答