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

Finden Sie JSON Zeichenfolgen in einer Zeichenfolge
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]);

Ausgabe:

Array
(
    [0] => {"action":"product","options":{...}}
    [1] => {"action":"review","options":{...}}
)

Regex101-Demo


Validierung der JSON-Strings

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:

function isValidJSON($string) {
    json_decode($string);
    return (json_last_error() == JSON_ERROR_NONE);
}

$valid_jsons_arr = array_filter($matches[0], 'isValidJSON');

Online-Demo

  • 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:

  1. Kopieren Sie die gesamte Regex und ersetzen Sie sie ?R welche Zeichenfolge Beispiel kopiert
  • Ebene 1 json => {(?:[^{}]|(?R))*} => {(?:[^{}]|())*}
  • Ebene 2 json => {(?:[^{}]|({(?:[^{}]|(?R))*}))*} => {(?:[^{}]|({(?:[^{}]|())*}))*}
  • Ebene n json => {(?:[^{}]|(?<n times>))*}
  1. wenn beschlossen, auf einer bestimmten Ebene zu ersetzen ?R mit Leerzeichenkette.

Fertig.

1643905447 829 Finden Sie JSON Zeichenfolgen in einer Zeichenfolge
Alejandro Ramírez

Ich würde ein hinzufügen * um die verschachtelten Objekte einzuschließen:

{(?:[^{}]*|(?R))*}

prüfen Sie Demo

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

Siehe das Beispiel auf Regex101

.

757460cookie-checkFinden Sie JSON-Zeichenfolgen in einer Zeichenfolge

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy