Laden...

Serialisiertes PHP Objekt deserialisieren/per RegEx auslesen

Erstellt von echdeneth vor 3 Jahren Letzter Beitrag vor 3 Jahren 573 Views
echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren
Serialisiertes PHP Objekt deserialisieren/per RegEx auslesen

Moin,

ich habe ein serialisiertes PHP Objekt (Nein, Thema gehört nicht zu Web-Technologien),
dies möchte ich entweder deserialisieren oder per RegEx spezielle Werte auslesen.

Ausschnitt:
i:1;s:9:"UnitPrice";i:0;s:5:"Value";s:2:"15";s:9:"FieldName";s:20:"....

Nun muss der Wert nach Value ausgelesen werden.

serial = serialisiertes PHP Objekt
s = List<string> wo die Werte hinein sollen



                        var rx = new Regex("\"Value\"", RegexOptions.Compiled | RegexOptions.IgnoreCase);
                        Match match = rx.Match(serial);
                        while (match.Success)
                        {
                            s.Add(serial.Substring(match.Index + 14, 4).Replace("\"", ""));
                            match = match.NextMatch();
                        }

Das ist aber leider etwas schwammig....

Nun wollte ich es über:


var output = string.Join(";", Regex.Matches(serial, "\\\"(.*?)\\\"")
                                                   .Cast<Match>()
                                                   .Select(m => m.Groups[1].Value));

versuchen.

Ideal wäre es evtl wenn ich den Wert nach: s:5:"Value"; auslese, dies bekomme ich mit RegEx nicht hin.
Kann ich überhaupt eine solche Zeichenkette mit RegEx verwenden?
Ist dieser gedankengang Zielführend? oder soll ich mich besser an eine deserialisierung machen?
Gibt es für eine solche deserialisierung DesignPatterns?

Danke

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

W
955 Beiträge seit 2010
vor 3 Jahren

Warum splittest du den String nicht in ein Array, als Trennzeichen '"Value"' nehmen, dann im darunter gesplitteten Array[':'] drittes Element auslesen.

87 Beiträge seit 2016
vor 3 Jahren

Hallo,

  • Splitten am ;
  • Index von Value + 1 ist die Zeichenkette mit deinem Wert
  • Zeichenkette verarbeiten um an Wert zu kommen

glandorf

T
2.222 Beiträge seit 2008
vor 3 Jahren

Das RegEx geparse kannst du dir tatsächlich sparen.
Mir ist nur nicht klar in welchem Format hier das Objekt Serialisiert ist, sieht nicht nacht einem bekannten Format aus (Xml, Json etc.)

Ansonsten würde ich dir empfehlen, wie Witte auch schon geschrieben hat, das ganze per einfachen String Operationen umzusetzen.
Dafür RegEx nehmen wäre vermutlich nicht einfachert und müsste auch über zwei Ebenen laufen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Die Zeichenkette ist nur ein Ausschnitt.

Die Quelle ist ein Serialisiertes PHP-Objekt, zu lang um das in ein Array einzulesen.
ich weiss nicht ob ich den kompletten string hier posten darf.

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Warum splittest du den String nicht in ein Array, als Trennzeichen '"Value"' nehmen, dann im darunter gesplitteten Array[':'] drittes Element auslesen.

Ich probiere das mal, nach ";" trennen und den string im array nach "Value" auslesen...


s:5:"Value";s:2:"15"

s = String, Länge 5 - Wert "Value"
darauf folgt:
s = String, Länge 2 - Wert "15"

muss ich im ganzen serialisierten string machen

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

16.827 Beiträge seit 2008
vor 3 Jahren

PHP serialisiert in ein proprietäres Format. Das zu verwenden ist halt prinzipiell schon quatsch.
Leider ist das aber gar nicht so selten (vermutlich weil PHP Entwickler leider immer noch nichts von Standards verstehen).

Das Glück ist, dass man aber sehr viele Google Treffer hat, die einem die Lösung schon gibt.
Google Suche nach "c# serialized php object"

Hättest Du das einfach mal gegoogelt oder die Forensuche benutzt, dann wärst auch in unser anderes Thema dazu gekommen 🙂PHP serialize() in C# Array

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

PHP serialisiert in ein proprietäres Format. Das zu verwenden ist halt prinzipiell schon quatsch.
Leider ist das aber gar nicht so selten (vermutlich weil PHP Entwickler leider immer noch nichts von Standards verstehen).

Darauf habe ich kein Einfluss, ist aus WooCommerce exportiert und muss ich genau so nehmen

Das Glück ist, dass man aber sehr viele Google Treffer hat, die einem die Lösung schon gibt.

>

Mag nicht so aussehen , aber ich habe sehr lange gesucht und die meisten Suchergebnisse waren für mich nicht brauchbar...
oft wird auf das NuGet Paket verwiesen oder im falschen Kontext

Hättest Du das einfach mal gegoogelt oder die Forensuche benutzt, dann wärst auch in unser anderes Thema dazu gekommen 🙂
>

Habe ich auch gemacht, DAS! habe ich aber nicht gefunden!
Den deserialisierer teste ich mal, ich hatte ja eigentlich gehofft das mit RegEx zu machen zumal ich aus dem ganzen String
der 2281 Zeichen lang ist nur 3 Werte benötige aber den regulären AUsdruck (noch) nicht hinbekomme

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

16.827 Beiträge seit 2008
vor 3 Jahren

oft wird auf das NuGet Paket verwiesen oder im falschen Kontext

Der erste Treffer ist ein Gist, das vielversprechend aussieht.
C# php Serializer
Ist halt kein schöner Code Snippet, weil ArrayList etc.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Danke, hat geholfen

ich nehme an RegEx mag niemand 😁

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

16.827 Beiträge seit 2008
vor 3 Jahren

Regex für sowas "starres" ist halt gar nicht notwendig.

T
2.222 Beiträge seit 2008
vor 3 Jahren

Fall es mal jemand braucht, hier noch eine Aufschlüsselung was der String im Detail bedeutet, den PHP beim serialisieren rausgibt.

Exploit PHP Deserialization

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.