2011-04-23 6 views
1

Juste une question regex rapide ... espérons-PHP/Regex: JSON match à l'intérieur JSON

J'ai une chaîne qui ressemble à quelque chose comme ceci:

$string = 'some text [ something {"index":"{"index2":"value2"}"}] [something2 {"here to be":"more specific"}]'; 

Je veux être en mesure d'obtenir la valeur :

{"index":"{"index2":"value2"}"} 

Mais mes tentatives de correspondance (ou remplacer) continuer à me donner:

{"index":"{"index2":"value2"} 

preg_replace('/\[(.*?)({.*?[^}]})*?\]/is', "", $string); 

Ici, je fais correspondre toute la zone de support carré, mais j'espère que vous pouvez voir ce que je suis en train de faire.

La négation du "ne correspond pas" ne semble pas faire quoi que ce soit. Peut-être que j'ai juste besoin d'un OU là ou quelque chose.

Eh bien, merci, si vous avez le temps de répondre. La chaîne $ pourrait contenir plusieurs instances du {}, donc une regex gourmande ne fonctionnera pas .... que je connais.

+1

En général, l'appariement de quelque chose comme celui impliquant des délimiteurs ouverts/fermés appariés (accolades ou crochets) ne peut pas être effectué avec une expression régulière. Si vos chaînes ont d'autres délimiteurs fiables * autour du segment JSON, cela pourrait être possible. – Pointy

+0

L'homme, ça craint. J'ai vu quelque chose qui disait cela sur un post pour C#. Si c'était toi, exploserais-tu et apparierais-tu à l'intérieur de chaque segment de tableau? Ou est-ce juste pas une bonne idée du tout? –

+1

@Senica: Pourquoi ne pas analyser correctement le JSON avec une fonction d'analyse JSON, comme une personne sensée? C'est ce que ces fonctions _existent for_. C'est tout le but de tout le système JSON. –

Répondre

0

Vous ne pouvez pas faire une regex compter les parenthèses d'ouverture et les parenthèses de fermeture correspondantes, vous devez utiliser une boucle simple pour faire cela, mais vous pouvez obtenir la chaîne complète de la première parenthèse d'ouverture à la dernière fermeture une expression gourmande comme: ({.*}). Notez que les fonctions de chaînes simples sont beaucoup plus rapides que les expressions régulières, vous devriez donc les utiliser à la place.

+0

Pointy devrait obtenir ces points depuis qu'il a répondu en premier, mais il a juste laissé un commentaire. Merci de réitérer. –

0

Si le JSON intégré dans la chaîne est syntaxiquement correcte, vous devez simplement couper la partie indésirable de premier plan et utiliser la fonction json_decode.