J'ai beaucoup de chaînes JSON mal formées, comme ceci :
{ "identifiant":23424938, "nom": unN, "réf":aN, "juil": unN, "chat":{}, "src":[], "Code": "SA", "type": d, "spéc":[i,j], "enfant": un }J'essaie de créer une expression régulière pour citer une valeur JSON sans succès.
J'ai fini par utiliser
/":([^"d{[]+?[^,}]?)/
qui a tout corrigé sauf les valeurs à l'intérieur du tableau, tel que[i,j]
, il ne sera pas converti en["i","j"]
.Pouvez-vous m'aider avec les valeurs entre parenthèses ?
https://regex101.com/r/CGskmy/1
Cette tâche sera quelque peu difficile en raison de l'ambiguïté. Par exemple,
{ "x": [y] }
是变成{ "x": "[y]" }
还是变成{ "x": ["y"] }
?我会假设未加引号的字符串不包含 JSON 控制字符,例如'[', ']', '{', '}', '"', ':', ','
.Je pense que vous pouvez y parvenir en utilisant des groupes de capture nommés, qui est une fonctionnalité de PHP possible avec PCRE. Cela nécessite une certaine programmation pour effectuer le remplacement. L'opération
preg_replace
habituelle ne suffit pas car nous ne remplaçons pas toutes les allumettes.C'est la méthode que j'ai proposée. Tout d’abord, je fais correspondre les chaînes entre guillemets et je les ignore. Deuxièmement, je fais correspondre les chiffres et je les ignore. Enfin, je fais correspondre la chaîne sans guillemets et la stocke dans un groupe de capture appelé "sans guillemets". Notez que PCRE tentera de faire correspondre ces alternatives dans l'ordre dans lequel elles sont mises en correspondance. Les chaînes sans guillemets ne correspondent que si les chaînes et les nombres entre guillemets ne peuvent pas correspondre. C’est la clé de cette approche.
Une fois que j'ai fait correspondre toutes les chaînes non citées, il suffit de concaténer la chaîne de sortie avec le remplacement. Cela se fait en parcourant les correspondances et en copiant les fragments de chaîne dans la sortie.