我有一個字符串,它看起來像這樣:這是什麼類型的符號?
[{text:"key 1",value:"value 1"},{text:"key 2",value:"value 2"},{text:"key 3",value:"value 3"}]
我不知道這是什麼樣的符號,這是由ASP .NET後臺生成AFAIK。它看起來和JSON非常相似,但是調用json_decode()會失敗。
有人可以給我一些這種符號的光線,並提供給我一個有效的方法來解析它到PHP的鍵/值數組?
我有一個字符串,它看起來像這樣:這是什麼類型的符號?
[{text:"key 1",value:"value 1"},{text:"key 2",value:"value 2"},{text:"key 3",value:"value 3"}]
我不知道這是什麼樣的符號,這是由ASP .NET後臺生成AFAIK。它看起來和JSON非常相似,但是調用json_decode()會失敗。
有人可以給我一些這種符號的光線,並提供給我一個有效的方法來解析它到PHP的鍵/值數組?
任何方式你可以改變輸出?引用鍵名似乎允許它正常解析:
$test = '[{"text":"key 1","value":"value 1"},{"text":"key 2","value":"value 2"},{"text":"key 3","value":"value 3"}]';
var_dump(json_decode($test));
它看起來像JavaScript語法(類似於JSON)。正則表達式是解析它的方法。剝去'['和']',然後在','上分開。然後分別解析每個對象。
當一個字符串包含一個逗號時,問題就會出現。 – giorgian 2009-08-28 22:12:41
分開},{就像我在下面的答案中指出的那樣。 – 2009-08-28 22:17:52
正則表達式可以處理包含逗號的引號字符串。我已經做了很多次了。 – 2009-08-29 01:48:14
它類似於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
我從來沒有用過它,但也許給看看json_decode。
它看起來像一個自定義格式。在開頭和結尾處替換[{和}]分隔符。然後爆炸的「},{」,你會得到這樣的:
text:"key 1",value:"value 1"
text:"key 2",value:"value 2"
text:"key 3",value:"value 3"
在這一點上,你可以遍歷數組中的每個元素,並使用的preg_match提取你的價值觀。
從技術上講,沒有理由一個字符串不能包含'},{... ...即使它比包含一個字符串的字符串更不可能,' – 2009-08-28 22:24:08
我選擇爆炸的原因},{是因爲肯定在示例輸出中顯示爲字段塊內值之間的分隔符。但是,我同意。 – 2009-08-29 04:43:07
它看起來幾乎就像一種數組式樣的數據容器 - 文本是索引,值是值。
$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);
}
爲了讓您的JSON數據通過json_decode()
接受,你可以使用下面的正則表達式:
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實現之間的比較:
即樣品是有效YAML,這是JSON的超集。 YAML似乎有at least 3 PHP libraries。
如果它實際上是YAML,那麼最好使用真正的YAML庫,而不是通過正則表達式運行它並將其扔到JSON庫中。 YAML支持其他功能(除了未加引號的字符串),如果您的ASP.NET後端使用,則不會在旅程中生存。
我想我可以str_replace文本:和值:並用雙引號括起來。 – 2009-08-28 22:30:33