2

質問を単純化しましょう:

必要なのは、角かっこで囲まれたコンマで文字列をexplode()することだけです。問題は、コンマで選択された要素自体にコンマを含めることができるため、単純な展開が機能しないことです。JSONをデコードする方法を尋ねていません。

引数の数、それらのタイプは常に異なります。

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

私がコードのこの部分を持っていると仮定すると:

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

誰かが正規表現(または代替方法)を提案して、すべてのコンマ区切りのエントリを(文字列として)取得できますか?問題は、変数自体にコンマを含めることができることです。したがって、これには再帰が必要だと思います。

期待される結果は、次のエントリを含む配列になります。

{"class": "navigation", "id": "navigation"}
NULL
'bar'
4

5 に答える 5

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'"
}

正確には再帰的な正規表現ではなく、先読みのアサーションです。条件は、コンマの後に}を続けないか、または後に{を続ける必要があるということです。

于 2011-02-27T16:45:44.053 に答える
2

何時間もの作業の後、PHP が NULL (大文字の null) を含む JSON 文字列の解析に失敗することに気付きました。それが原因で、次のコードが機能しませんでした。ただし、NULL を null に置き換えるだけで問題は解決しました。

var_dump(json_decode('[{"class": "navigation", "id": "navigation"}, NULL, "bar"]')
于 2011-02-27T16:15:10.683 に答える
0

ハックアラート!

  1. {}を一重引用符で囲み、{"JSON":"data"}が'{"JSON":"data"}'になるようにします

  2. str_getcsv()を使用して文字列を解析します(現在はCSVです)

  3. 結果の配列を調べて、{}から一重引用符を削除します

于 2011-02-27T15:55:43.007 に答える
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'
于 2011-02-27T15:39:25.133 に答える
0

それはjsonのように見えます。配列を作成するjson_decodeを使用する必要があります。その後、配列をループしてキー/値を取得できます。

于 2011-02-27T15:39:49.350 に答える