我有一个看起来像这样的字符串:
[{text:"key 1",value:"value 1"},{text:"key 2",value:"value 2"},{text:"key 3",value:"value 3"}]
我不确定这是什么样的符号,AFAIK这是由ASP .NET后端生成的。它看起来与JSON非常相似,但在此调用json_decode()失败。
有人能给我一些关于这种表示法的信息,并为我提供一种有效的方法,用PHP将其解析为一个键/值数组吗?
答案 0 :(得分:2)
它类似于JSON,但显然不完全符合规范。 PHP json_decode
函数只喜欢双引号键:
// the following strings are valid JavaScript but not valid JSON
// the name and value must be enclosed in double quotes
// single quotes are not valid
$bad_json = "{ 'bar': 'baz' }";
json_decode($bad_json); // null
// the name must be enclosed in double quotes
$bad_json = '{ bar: "baz" }';
json_decode($bad_json); // null
// trailing commas are not allowed
$bad_json = '{ bar: "baz", }';
json_decode($bad_json); // null
答案 1 :(得分:2)
你能改变输出吗?引用键名似乎允许它正常解析:
$test = '[{"text":"key 1","value":"value 1"},{"text":"key 2","value":"value 2"},{"text":"key 3","value":"value 3"}]';
var_dump(json_decode($test));
答案 2 :(得分:2)
该示例有效YAML,它是JSON的超集。 YAML似乎有at least 3 PHP libraries。
如果它实际上是YAML,那么最好使用真正的YAML库,而不是通过正则表达式运行并将其放在JSON库中。 YAML支持其他功能(除了不带引号的字符串),如果你的ASP.NET后端使用,它们将无法在旅行中存活下来。
答案 3 :(得分:0)
它看起来像javascript语法(类似于JSON)。正则表达式是解析它的方法。剥去'['和']',然后分开','。然后单独解析每个对象。
答案 4 :(得分:0)
它看起来像一个自定义格式。在开头和结尾替换[{和}]分隔符。然后在“},{”上爆炸,你得到这个:
text:"key 1",value:"value 1"
text:"key 2",value:"value 2"
text:"key 3",value:"value 3"
此时,您可以迭代数组中的每个元素,并使用preg_match来提取您的值。
答案 5 :(得分:0)
它看起来几乎像一种数组样式的数据容器 - 文本是索引,值是值。
$string = ....;
$endArray = array()
$string = trim($string,'[]');
$startArray = preg_split('/{.+}/');
// Array of {text:"key 1",value:"value 1"}, this will also skip empty conainers
foreach( $startArray as $arrayItem ) {
$tmpString = trim($arrayItem,'{}'); // $tmp = text:"key 1",value:"value 1"
$tmpArray = explode(',',$tmpString); // $tmpArray = ('text: "key 1"', 'value: "value 1"')
$endArray[substr($tmpArray[0],7,strlen($tmpArray[0])-1)] = substr($tmpArray[1],7,strlen($tmpArray[1])-1);
}
答案 6 :(得分:0)
要使json_decode()
接受您的JSON数据,您可以使用以下正则表达式:
function json_replacer($match) {
if ($match[0] == '"' || $match[0] == "'") {
return $match;
}
else {
return '"'.$match.'"';
}
}
$json_re = <<<'END'
/ " (?: \\. | [^\\"] )* " # double-quoted string, with escapes
| ' (?: \\. | [^\\'] )* ' # single-quoted string, with escapes
| \b [A-Za-z_] \w* (?=\s*:) # A single word followed by a colon
/x
END;
$json = preg_replace_callback($json_re, 'json_replacer', $json);
因为匹配永远不会重叠,所以在字符串中后跟冒号的单词永远不会匹配。
我还发现了PHP的不同JSON实现之间的比较:
答案 7 :(得分:-2)
我从未使用过它,但也许可以看看json_decode。