2011-02-27 92 views
2

讓簡化問題:解析串入數組{{導航({ 「類」: 「導航」, 「ID」: 「導航」})}}部2

所有我需要的是爆炸( )由括號之間的逗號字符串。問題是由逗號選擇的元素本身可以有一個逗號,因此簡單的爆炸是行不通的。我不問如何解碼JSON。

參數的數量,它們的類型總是不同的,例如,

('foo') 
('bar', NULL) 
({"JSON": "data"}, 'test') 

假設我有這部分代碼:

({"class": "navigation", "id": "navigation"}, NULL, 'bar' /* [..] */) 

任何人都可以提出一個正則表達式(或其他方法)來獲取所有的逗號分隔的條目(如字符串)?問題是變量本身可以包含逗號。因此,我認爲這需要遞歸。

預期的結果應該是一個包含以下條目的數組:

{"class": "navigation", "id": "navigation"} 
NULL 
'bar' 
+0

這裏有什麼規則?這是任何PHP代碼?字符串和評論可以包含任何內容其他功能呢:'{'Peoples''names':['a',2,getThird(「1」,{「q」:5})]} //,6'(我不知道足夠的PHP想出可怕的東西,但我知道它有奇怪的字符串,一個)。如果它是真正的PHP,最好的辦法就是找到解析器。 – Kobi 2011-03-01 19:51:44

回答

2

剝離單引號多小時的工作後,我所遇到的是PHP將無法解析包含NULL JSON字符串(upperc ase null)。那是導致下面的代碼不工作的原因。但是,簡單地將NULL替換爲null解決了問題。

var_dump(json_decode('[{"class": "navigation", "id": "navigation"}, NULL, "bar"]') 
0

添加代碼之間[和],並使用json_decode()

它應該返回一個關聯數組

您應該使用[]對於隱式索引和{}顯式索引

示例:

[] : ['w', null, 123, {'a':1}] <- implicit keys (0, 1, 2, 3) 
{} : {'0':'w', '1':null, '2':123, '3':{'a':1}} <- explicit keys (0, 1, 2, 3) 

  不能隱式/顯式索引混入相同的結構,但可以爲例如,創建如上面的實施例包含不同的值的陣列([])。

$code = substr('({"id":"navigation"}, null, "bar")', 1, -1); // removes ^\(and \)$ 
$result = json_decode('[' . $code . ']'); 

echo $result[0]['id']; // returns 'navigation' 
echo $result[1]; // returns NULL 
echo $result[2]; // returns 'bar' 
+0

這還不夠,因爲json_decode('{「best」:「mest」,「best」}')會返回NULL – Gajus 2011-02-27 15:51:02

+0

您忘記了[和],並且您提到的那個字符串是無效的json – w35l3y 2011-02-27 15:53:56

+0

'[「foo 「]'會起作用,但'[」test「:」best「,」best「]'會失敗。要麼它是無效的,我需要它的工作。 – Gajus 2011-02-27 16:06:10

0

這看起來像json。你應該使用json_decode,它會創建一個數組,然後你可以遍歷數組來獲得鍵/值。

0

黑客警報!

  1. 包{}成單引號,讓您{ 「JSON」: 「數據」}變爲 '{ 「JSON」: 「數據」}'

  2. 使用str_getcsv()來解析字符串(這是一個CSV現在)

  3. 去,雖然結果數組和{}

+0

這似乎是一個聰明的做法,雖然它不是,因爲:{{「class」:「navigation」,「id」:「navigation」},NULL,'bar''將返回'{「class」:「navigation 「作爲一個元素並且」ID「:」導航「},作爲另一個元素。 – Gajus 2011-02-27 16:05:11

+0

@Guy ok,但第一步會將{「class」:「navigation」,「id」:「navigation」},NULL,'bar'轉換爲{「class」:「navigation」,「id」:「導航「}」,NULL,「bar」,以便JSON位變成單個值(以CSV形式) – beklip 2011-02-27 16:16:39

2

這裏的一些作品:

$str = 'NULL, {"class": "navigation", "id": "navigation"}, NULL, \'bar\''; 
var_dump(preg_split('%(,(?!.*})|,(?=.*{)\s+)%', $str)); 

結果:

~$ php ./test.php 
array(4) { 
    [0]=> 
    string(4) "NULL" 
    [1]=> 
    string(44) "{"class": "navigation", "id": "navigation"}" 
    [2]=> 
    string(5) "NULL" 
    [3]=> 
    string(6) "'bar'" 
} 

不完全是一個遞歸的正則表達式,而是前瞻斷言。條件是不應該跟隨逗號},否則應該跟隨{。