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
Warum splittest du den String nicht in ein Array, als Trennzeichen '"Value"' nehmen, dann im darunter gesplitteten Array[':'] drittes Element auslesen.
Hallo,
glandorf
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.
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
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
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
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke, hat geholfen
ich nehme an RegEx mag niemand 😁
"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein
Regex für sowas "starres" ist halt gar nicht notwendig.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Fall es mal jemand braucht, hier noch eine Aufschlüsselung was der String im Detail bedeutet, den PHP beim serialisieren rausgibt.
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.