次のような不正な形式の JSON 文字列がたくさんあります:
{ "id":23424938、 「名前」:aN、 "参照":aN、 "7月":aN、 "猫":{}、 "ソース":[], "コード":"SA", "タイプ":d、 "仕様":[i,j], 「子供」:a }
JSON 値を二重引用符で囲む正規表現を構築しようとしていますが、成功しません。
私は最終的に /":([^"d{[] ?[^,}]?)/
を使用して、配列内の値を除くすべてを修正しました。たとえば、[i,j]
は ["i","j"]
には変換されません。
括弧内の値について教えていただけますか?
https://regex101.com/r/CGskmy/1
このタスクは曖昧なため、多少難しくなります。たとえば、
{ "x": [y] }
は{ "x": "[y]" }
になりますか、それとも{ "x": [" y" になりますか? ]}
?引用符で囲まれていない文字列には、'['、']'、'{'、'}'、'"'、':'、','
などの JSON 制御文字が含まれていないと想定します。これは、名前付きキャプチャ グループを使用して実現できると思います。これは、PCRE を使用して可能な PHP の機能です。これには、置換を実行するためのプログラミングが必要です。すべての一致を置換するわけではないため、通常の
preg_replace
操作では十分ではありません。これが私が思いついた方法です。まず、引用符で囲まれた文字列を照合し、それらを無視します。 2 番目に、数字を一致させて無視します。最後に、引用符で囲まれていない文字列を照合し、「unquoted」というキャプチャ グループに保存します。 PCRE は、一致する順序でこれらの代替を一致させようとすることに注意してください。引用符で囲まれていない文字列は、引用符で囲まれた文字列と数値が一致しない場合にのみ一致します。これがこのアプローチの鍵です。
引用符で囲まれていない文字列をすべて一致させたら、出力文字列を置換文字列と連結するだけです。これは、一致を反復処理し、文字列のフラグメントを出力にコピーすることによって行われます。
リーリーここでは、完全な JSON 数値構文や、
true
、false
、null
などの JSON 構文を扱いません。この回答が出発点となり、ニーズに合わせて調整できることを願っています。InSyncは、名前付きキャプチャ グループを使用せず、代わりに不要な一致をスキップするように PCRE に指示する優れた正規表現を提供します。
リーリー