geloescht_JesterDay Geschrieben 7. Juli 2006 Geschrieben 7. Juli 2006 Hallo, ich suche eine RegExp, mit der ich aus einem String Name1 : 'Value1', Name2 : 2, Name3 : [ 1, '2', 3 ], Name4 : 'false', Name5 : { Sub1 : 'Subval1', Sub2 : 2, Sub3 : [ 4, '5', 6 ], Sub4 : 'false' } alle Name:Value Paare rausbekommen kann. Also Name1 : 'Value1' wäre so ein Paar. Aber auch Name3 : [1, '2', 3] oder aber Name5 : { Sub1 : 'Subval1', Sub2 : 2, Sub3 : [ 4, '5', 6 ], Sub4 : 'false' } Das ganze mit php und ich denke preg_match_all mit der richtigen RegExp sollte mir da helfen können, oder? Ok, Name5 ist dann schon wieder ein Extremfall. Wenn ich eine Möglichkeit hätte, alle anderen Werte zu bekommen würde mir das erstmal schon reichen. Die die sowas kennen: Ja, ich will hier in PHP einen JSON-String auswerten und verarbeiten. Und nein, fertige C-Libraries sind keine Lösung. Auch die JSON_PHP Klassen helfen mir nicht, da die erstens nur ab PHP5 funktionieren und zweitens das auch nicht hinbekommen EDIT: Eine bessere Überschrift ist mir nicht eingefallen Zitieren
etreu Geschrieben 8. Juli 2006 Geschrieben 8. Juli 2006 Du nimmst einfach 3 Muster für die 3 Möglichkeiten. $patternName = "Name\d+"; $patternSimpleNumber = "/(($patternName)\d+)),? /"; $patternSimpleString = "/(($patternName):'(.+?)'),? /"; $patternList = "/(($patternName)\[((\d+),)+\])),? /"; $patternComplex = "(($patternName):\{(.+?)\})"; // mit dem Wert den RegEx rekursiv anwenden [/PHP] Man das Ganze natürlich auch verkürzen, indem man lookahead-Expressions benutzt. Aber so (vom Prinzip her) sollte es funktionieren. Prüfen tust du mit Hilfe der Funktion preg_match_all. Zitieren
geloescht_JesterDay Geschrieben 10. Juli 2006 Autor Geschrieben 10. Juli 2006 Name\d war nur ein Beispiel. Namen können alles sein, was den Namenskonventionen entspricht... Hab jetzt mal folgende 3 RegEx: // Name : Object preg_match_all('/([a-z0-9]+) : ({.*})/i', input, $match) // Name : Array preg_match_all('/([a-z0-9]+) : (\\[.*\])/iU', input, $match) // Name : Value preg_match_all('/([a-z0-9]+) : (\'?[a-z0-9]+'?)/i', input, $match) Damit kann ich sie ja immerhin schonmal entsprechend verkleinern. Allerdings passt "Name : Value" auch bei den Objekten (also Name5 im Beispiel). Gibt es eine Möglichkeit da eine Verneinung mit in die RegEx zu basteln? Also sowas wie: /([a-z0-9]+) : [B](!{ )[/B](\'?[a-z0-9]+'?)/i' Wenn ich das so mache findet er gar nichts mehr. Zitieren
etreu Geschrieben 10. Juli 2006 Geschrieben 10. Juli 2006 Verneinung sieht in etwa so aus (alles ausser n): $notN = "/[^n]+/"; [/PHP] Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.