Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Serialisiertes PHP Objekt deserialisieren/per RegEx auslesen
echdeneth
myCSharp.de - Member



Dabei seit:
Beiträge: 144
Herkunft: Sachsen, Herrnhut/Zittau

Themenstarter:

Serialisiertes PHP Objekt deserialisieren/per RegEx auslesen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
witte
myCSharp.de - Member



Dabei seit:
Beiträge: 960

beantworten | zitieren | melden

Warum splittest du den String nicht in ein Array, als Trennzeichen '"Value"' nehmen, dann im darunter gesplitteten Array[':'] drittes Element auslesen.
private Nachricht | Beiträge des Benutzers
glandorf
myCSharp.de - Member

Avatar #avatar-4144.jpg


Dabei seit:
Beiträge: 58
Herkunft: Chemnitz

beantworten | zitieren | melden

Hallo,

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

glandorf
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1768
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
echdeneth
myCSharp.de - Member



Dabei seit:
Beiträge: 144
Herkunft: Sachsen, Herrnhut/Zittau

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von echdeneth am .
"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein
private Nachricht | Beiträge des Benutzers
echdeneth
myCSharp.de - Member



Dabei seit:
Beiträge: 144
Herkunft: Sachsen, Herrnhut/Zittau

Themenstarter:

beantworten | zitieren | melden

Zitat von witte
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von echdeneth am .
"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15528
Herkunft: BW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
echdeneth
myCSharp.de - Member



Dabei seit:
Beiträge: 144
Herkunft: Sachsen, Herrnhut/Zittau

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
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
Zitat von Abt
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"
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
Zitat von Abt
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
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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15528
Herkunft: BW

beantworten | zitieren | melden

Zitat von echdeneth
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.
private Nachricht | Beiträge des Benutzers
echdeneth
myCSharp.de - Member



Dabei seit:
Beiträge: 144
Herkunft: Sachsen, Herrnhut/Zittau

Themenstarter:

beantworten | zitieren | melden

Danke, hat geholfen

ich nehme an RegEx mag niemand
"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15528
Herkunft: BW

beantworten | zitieren | melden

Regex für sowas "starres" ist halt gar nicht notwendig.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1768
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers