Zum Inhalt springen

RegExp: Alle Einzelwerte aus einem String


Empfohlene Beiträge

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...