2017-01-12 183 views
0

我想請求幫助。在PHP中解析方括號和嵌套括號

我這句法

[86855,[[6615663,"Name 1 [GBR]","Name 2 [RUS]",86855,"2017-01-13T09:30:00.0000000",[[16942762,0,,,,1],[16942763,738,,,,2],[16942869,741,,,,1],[16942870,113,,,,1],[16944801,759,,,1],[16944804,759,,,2],[16943142,740,,,,1],[16943144,743,,,,5],[16943145,744,,,,5]],[[25262023,758],[25259130,748],[25259131,749],[25258578,739]],,,,,80104,194132,-1,-1,0,0,0,0,"Sport","League",6,22,0,null,"10890680"],[6614528,"Name 1 [SRB]","Name 2 [LUX]",86855,"2017-01-13T05:00:00.0000000",[[16939629,741,,,,1],[16939630,113,,,,1],[16939632,759,,,1],[16939634,759,,,2],[16939069,0,,,,1],[16939070,740,,,,1],[16939071,738,,,,2],[16942414,743,,,,5],[16942415,744,,,,5]],[[25257607,748],[25257608,749],[25257609,758],[25253011,739]],,,,,1610,48295,-1,-1,0,0,0,0,"Sport","League",6,22,0,null,"10888520"]],[[25138199,8,,,,"2017-01-13T05:00:00.0000000",,,,0,null,null]]],[] 

,我想從輸出獲取數組。像這樣的東西

[0] => 86855 
    [0] => 
    [0] => 6615663 
    [1] => "Name 1 [GRB]" 
    etc... 
    [1] => 
    [0] => 6614528 
    [1] => "Name 1 [SRB]" 
    etc... 

是否有可能通過任何章節做到這一點。表達或解析不知何故?

謝謝:)

+0

它看起來像兩個有效的JavaScript數組 –

+0

那麼,有沒有辦法如何解析那些JS數組到PHP? – Ernesto

+0

你是如何得出結論尋找正則表達式的;鑑於你沒有嘗試過自己的?爲什麼不詳細說明數據源?你知道,這看起來非常像一個廣泛存在的解析器的數據格式。 – mario

回答

0

您的數據看起來像裝在一個字符串數組。您可以使用eval構建一個數組,但是出於安全原因,您需要檢查您的字符串是否僅包含允許的項目(即:數值,字符串,空項目,空值和數組,換句話說,不包含可執行代碼),如果它格式良好。

第二次,您需要將「空」值更改爲PHP解析器能夠識別的值。

例子:

$pattern = '~ 
    (?(DEFINE)       # tokens definitions 
     (?<quoted> " [^"\\\\]*+ (?s:\\\\.[^"\\\\]*)*+ ") 
     (?<num> -? \d+ (?: \. \d*)? | \. \d+) 
     (?<item> \g<quoted> | \g<num> | \g<array> | null | \s*) 
     (?<itemList> \g<item> (?: \s* , \s* \g<item>)*) 
     (?<array> \[ \s* \g<itemList> \s* ]) 
    ) 

    \A \s* \g<itemList> \s* \z   # main pattern 
~xi'; 

if (preg_match($pattern, $str)) { 
    $expr = preg_replace('~"[^"\\\\]*+(?s:\\\\.[^"\\\\]*)*+"(*SKIP)(*F)|,\s*(?=,)~S', ',null', $str); 
    $expr = '$result=[' . $expr . '];'; 
    eval($expr); 
    print_r($result); 
} else throw new Exception('Bad format'); 
+0

哦,我的老兄,這真棒!正是我需要的,你幫了我很多:)非常感謝! :) 有用。 – Ernesto