Finden Sie JSON-Zeichenfolgen in einer Zeichenfolge
Lesezeit: 4 Minuten
Ich suche nach einer Möglichkeit, JSON-Daten in einer Zeichenfolge zu finden. Stellen Sie sich das wie WordPress-Shortcodes vor. Ich denke, der beste Weg, dies zu tun, wäre ein regulärer Ausdruck. Ich möchte den JSON nicht analysieren, sondern nur alle Vorkommen finden.
Gibt es eine Möglichkeit in Regex, eine übereinstimmende Anzahl von Klammern zu haben? Derzeit stoße ich auf dieses Problem, wenn ich verschachtelte Objekte habe.
Kurzes Beispiel zur Demonstration:
This is a funny text about stuff,
look at this product {"action":"product","options":{...}}.
More Text is to come and another JSON string
{"action":"review","options":{...}}
Als Ergebnis möchte ich die beiden JSON-Strings haben. Danke!
Sehen Sie sich diese Frage Regex an, um JSON zu validieren.
– Amal Murali
24. Februar 2014 um 17:30 Uhr
Ich denke, das größere Problem hier ist, warum Sie JSON-Strings in einen einfachen Textblock eingebettet haben? Ich denke, die Verbesserung des Designs ist möglicherweise ein besserer Weg, um hier vorzugehen, als zu versuchen, eine Regex zu erstellen, um JSON-Teilzeichenfolgen in freier Wildbahn zu finden.
– TypIA
24. Februar 2014 um 17:30 Uhr
Gibt es eine Möglichkeit in Regex, eine übereinstimmende Anzahl von Klammern zu haben? -> Nein. Regex ist dafür nicht gemacht. Warum benutzt du nicht json_decode und analysieren Sie das Ergebnisarray nach Daten, die Sie benötigen?
– ntaso
24. Februar 2014 um 17:30 Uhr
Das ist dir klar 42 wäre gültiges JSON? Als würde "Hi There!"? Wenn Sie Ihren JSON nicht darauf beschränken, nur ein codiertes Objekt zu sein, ist es so gut wie unmöglich, ALLE gültigen JSON-Formulare zu erkennen.
– Markus B
24. Februar 14 um 17:32 Uhr
Ich möchte diese JSON-Objekte als Shortcodes wie in WordPress verwenden. Die WordPress-Implementierung ist chaotisch, zumindest denke ich das. Um den Funktionen, die ich gerne ausführe, Daten zu geben, dachte ich, dass JSON der beste Weg wäre. Als Workaround könnte ich sowas machen [[{json}]]und passen einfach zusammen [[…]]. Allerdings möchte ich es so einfach wie möglich machen.
– Wurzelmann
24. Februar 14 um 17:33 Uhr
Amal Murali
Extrahieren der JSON-Zeichenfolge aus dem angegebenen Text
Da Sie nach einer vereinfachten Lösung suchen, können Sie den folgenden regulären Ausdruck verwenden, der die Rekursion verwendet, um das Problem des übereinstimmenden Satzes von Klammern zu lösen. Es passt alles dazwischen { und } rekursiv.
Beachten Sie jedoch, dass dies nicht garantiert in allen möglichen Fällen funktioniert. Es dient nur als schnelle Extraktionsmethode für JSON-Strings.
$pattern = '
/
{ # { character
(?: # non-capturing group
[^{}] # anything that is not a { or }
| # OR
(?R) # recurses the entire pattern
)* # previous group zero or more times
} # } character
/x
';
preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
In PHP ist die einzige Möglichkeit, um festzustellen, ob ein JSON-String gültig ist, die Anwendung json_decode(). Wenn der Parser den JSON-String versteht und den definierten Standards entspricht, json_decode() erstellt eine Objekt-/Array-Darstellung der JSON-Zeichenfolge.
Wenn Sie diejenigen herausfiltern möchten, die kein gültiges JSON sind, können Sie verwenden array_filter() mit Callback-Funktion:
Da Java keine rekursiven Schritte hatte, habe ich das Muster nur dreimal verwendet: {(?:[^{}]|({(?:[^{}]|({[^{}]*}))*}))*} war für mich ausreichend… aber hacky…
– rufreakde
27. November 18 um 16:02 Uhr
Ein Fall, in dem dies nicht funktioniert, ist, wenn Sie geschweifte Klammern in einer Zeichenfolge haben. z.B: {"text":"abc { def"}
– Achsen
22. Januar 20 um 14:15 Uhr
Javascript-Leute, die nach ähnlichen Regex suchen. Das (?R), das ein rekursives Regex-Muster ist, wird von Javascript, Python und anderen Sprachen als solche nicht unterstützt.
Notiz: Es ist kein 1 zu 1 Ersatz.
{(?:[^{}]|(?R))*} # PCRE Supported Regex
Schritte:
Kopieren Sie die gesamte Regex und ersetzen Sie sie ?R welche Zeichenfolge Beispiel kopiert
Hinzufügen zu den Antworten, die vorschlagen ?R für Rekursion: Wenn Sie auch andere Dinge in einer Regex-Zeichenfolge abgleichen möchten, nicht nur das JSON-Objekt (dh: ein JSON-Objekt, gefolgt von einer Zeichenfolge, wie z key: {jsonobject}), dann willst du Recurse nur die json-Regel:
(?<j>{(?:[^{}]|(?&j))*})
ich benutze benannte Teilmuster in diesem Beispiel. Beachten Sie die ?<j> und das (?&j), die das Untermuster definieren, bzw. darauf verweisen). Damit können Sie beispielsweise Folgendes abgleichen:
Passen Sie nur die json-Objekte an, auf die “ERROR: “:
ERROR: (?<j>{(?:[^{}]|(?&j))*})
ERROR: {"some": "info"} # will match
INFO: {"some": "info"} # won't match
Sehen Sie sich diese Frage Regex an, um JSON zu validieren.
– Amal Murali
24. Februar 2014 um 17:30 Uhr
Ich denke, das größere Problem hier ist, warum Sie JSON-Strings in einen einfachen Textblock eingebettet haben? Ich denke, die Verbesserung des Designs ist möglicherweise ein besserer Weg, um hier vorzugehen, als zu versuchen, eine Regex zu erstellen, um JSON-Teilzeichenfolgen in freier Wildbahn zu finden.
– TypIA
24. Februar 2014 um 17:30 Uhr
Gibt es eine Möglichkeit in Regex, eine übereinstimmende Anzahl von Klammern zu haben? -> Nein. Regex ist dafür nicht gemacht. Warum benutzt du nicht
json_decode
und analysieren Sie das Ergebnisarray nach Daten, die Sie benötigen?– ntaso
24. Februar 2014 um 17:30 Uhr
Das ist dir klar
42
wäre gültiges JSON? Als würde"Hi There!"
? Wenn Sie Ihren JSON nicht darauf beschränken, nur ein codiertes Objekt zu sein, ist es so gut wie unmöglich, ALLE gültigen JSON-Formulare zu erkennen.– Markus B
24. Februar 14 um 17:32 Uhr
Ich möchte diese JSON-Objekte als Shortcodes wie in WordPress verwenden. Die WordPress-Implementierung ist chaotisch, zumindest denke ich das. Um den Funktionen, die ich gerne ausführe, Daten zu geben, dachte ich, dass JSON der beste Weg wäre. Als Workaround könnte ich sowas machen [[{json}]]und passen einfach zusammen [[…]]. Allerdings möchte ich es so einfach wie möglich machen.
– Wurzelmann
24. Februar 14 um 17:33 Uhr