Ankündigung

Einklappen
Keine Ankündigung bisher.

Regex und Lookarounds

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • S4kar
    hat ein Thema erstellt Regex und Lookarounds.

    Regex und Lookarounds

    Hiho,

    momentan arbeite ich an einem PHP-Script, welches eine Datei ausliest und mithilfe von Regex und Lookarounds bestimmte Werte ausliest und abspeichert.
    Anfangs habe ich nur Werte ausgelesen, welche in keinem weiteren Zusammenhang mit anderen Werten stehen.
    Ein Beispiel ist z.B. folgendes:
    Regex:
    PHP-Code:
        if (preg_match("/\d+(?=,\\\\"type\\\\":\\\\"construction)/", $line$match)) {
            
    $Construction = $match[0];
            unset(
    $match);
        } 
    Dateiausschnitt:
    Code:
    {\"value\":7,\"type\":\"construction_rebate\",\"__class__\":\"ConstructionRebateBonus\"},
    Bis dahin komme ich zurecht.
    Jetzt möchte ich aus folgendem Ausschnitt die Werte von player_id, expeditionPoints und solvedEncounters auslesen.
    Code:
    {\"player\":{\"player_id\":1234567,\"name\":\"IchBinEinN4me\",\"avatar\":\"addon_portrait_id_kimberly\",\"__class__\":\"BasePlayer\"},\"expeditionPoints\":84304,\"solvedEncounters\":61,\"__class__\":\"GuildExpeditionContribution\"},
    Dazu habe ich bereits folgenen Code:
    PHP-Code:
    if (preg_match_all("/(?<=\\\\"player\\\\":{\\\\"player_id\\\\":)\d+/"$line$gexpid)) {
            
    print_r($gexpid);
        } 
    Hier wurde preg_match_all gewählt, weil es viele solcher Treffer gibt und ich alle haben möchte.
    Ausgegeben wird mir hier also ein Array mit allen player_id's.

    Meine Frage ist jetzt, kann ich meinen Ausdruck so erweitern, dass player_id, expeditionPoints und solvedEncounters ausgelesen werden und direkt zusammen in einem Array abgespeichert werden?
    Oder muss ich player_id, expeditionPoints und solvedEncounters alle einzeln auslesen und mir dann alle in einem array zusammenfügen?

    grüße

  • S4kar
    antwortet
    An der Quelle kann ich halt nichts ändern, die muss ich nehmen wie sie ist und mir halt so zurecht legen, dass ich da meine gewünschten Daten rausbekomme...

    Einen Kommentar schreiben:


  • chorn
    antwortet
    JSON ist immer UTF8 - wenn es nicht als UTF8 geliefert wurde, ist es kein JSON. Encode/Decode sollte nur notwendig sein, wenn dein Script nicht UTF8 ist, aber das ist auch Müll. Wenn json_decode nichts liefert, dann ist deine Quelle Müll.

    Einen Kommentar schreiben:


  • S4kar
    antwortet
    Zum Punkt utf8_decode:
    Code:
    $String = '{\"player\":{\"player_id\":1234567,\"name\":\"G\\u00fctiger\",\"avatar\":\"addon_portrait_id_kimberly\",\"__class__\":\"BasePlayer\"},\"expeditionPoints\":84304,\"solvedEncounters\":61,\"__class__\":\"GuildExpeditionContribution\"}';
    echo utf8_decode($String);
    Ausgabe:
    Code:
    {\"player\":{\"player_id\":1234567,\"name\":\"G\u00fctiger\",\"avatar\":\"addon_portrait_id_kimberly\",\"__class__\":\"BasePlayer\"},\"expeditionPoints\":84304,\"solvedEncounters\":61,\"__class__\":\"GuildExpeditionContribution\"}
    Leider nicht das gewünschte Ergebniss.
    Um dann nochmal zu json_decode.
    Damit ich json_decode erfolgreich anwenden kann, muss ich die Backslashes entfernen. Oder gibt es da einen anderen Trick?
    BlackScorb hatte in seinem Beispiel oben nämlich auch keine Backslashes mehr.

    Thema JSON-Path, sieht interessant aus, ist einen Blick wert.
    Ich sehe aber nicht wie JSON-Path mein Problem mit den Umlauten löst...

    Edit:
    Hab das Problem jetzt mit strtr gelöst.

    Danke

    Einen Kommentar schreiben:


  • chorn
    antwortet
    The HTTP Archive format or HAR, is a JSON-formatted archive file format
    Also nimm einfach json_decode und lass den regex Kram weg, dann brauchst du dich auch nicht um die Backslashes kümmern, und JSON ist immer UTF8. Wenn du unbedingt in dem JSON rumrennen willst, nimm sowas wie JSON-Path, da gibt's auch fertige Implementierungen, einfach googlen "php json path".

    Einen Kommentar schreiben:


  • JaMa
    antwortet
    Das ist (nicht mehr gültiger) Unicode. Du entfernst das Backslash vor dem u. Korrekt wäre für ü \u00fc.
    Mit utf8_decode kannst du den Unicode String decoden.

    EDIT:
    json_decode müsste das auch direkt gleich selber machen.

    Einen Kommentar schreiben:


  • S4kar
    antwortet
    So, nachdem ich mir jetzt json_decode mal angeschaut habe, kann ich sagen, dass ich größtenteils umsetzen konnte, was ich wollte.
    Jedoch stehe ich noch vor einem kleinen Problem.

    Dazu nochmal zur aktuellen Situation.
    Es liegt eine Datei vor mit >80k Zeilen.
    Ich suche mittels Regulären Ausdrücken die entsprechenden Stellen/Strings, entferne anschließend mittels str_replace die Backslashes und wende daraufhin json_decode an, um wie im obigen Beispiel z.B. die player_id in eine variable zu speichern.

    Als Beispiel:
    Folgender String existiert in der Datei und wird mittels Regulärer Ausdrücke gefunden:
    Code:
    {\"player\":{\"player_id\":1234567,\"name\":\"G\\u00fctiger\",\"avatar\":\"addon_portrait_id_kimberly\",\"__class__\":\"BasePlayer\"},\"expeditionPoints\":84304,\"solvedEncounters\":61,\"__class__\":\"GuildExpeditionContribution\"},
    Jetzt ein Teil des Problems, so wie ich das sehe, muss ich die Backslashes entfernen, damit ich json_decode anwenden kann. Das funktioniert auch auf den Großteil der Strings.
    Im gezeigten Beispiel ist aber das Problem, dass der Name (Gütiger) ein Umlaut enthält, welches als \\u00fc dargestellt wird.
    Ich entferne also alle Backslashes mit str_replace und damit ist natürlich auch das Ü hinfällig.
    Code:
    {"player":{"player_id":1234567,"name":"Gu00fctiger","avatar":"addon_portrait_id_kimberly","__class__":"BasePlayer"},"expeditionPoints":84304,"solvedEncounters":61,"__class__":"GuildExpeditionContribution"},
    Ich habe also ein Problem mit der Kodierung.
    Habe schon mittels mb_detect_encoding versucht die Kodierung zu ermitteln. Ausgabe ist ASCII, aber das Ü sieht nachdem was ich gefunden habe nicht nach ASCII aus. Habe anschließend auch einfach mal folgendes versucht:
    PHP-Code:
    $test iconv('ASCII''UTF-8//IGNORE'$String); 
    Mit dem Ergebniss, dass sich nichts ändert

    Wie gehe ich hier am besten mit Umlauten in Namen um / Wie kann ich die Umlaute umwandeln?
    Gibt es eine einfache Funktion dazu und um welche Kodierung handelt es sich hier?

    Danke schon mal...

    grüße

    Edit:
    Evtl. interessant zu wissen, es handelt sich um eine .har Datei

    Einen Kommentar schreiben:


  • S4kar
    antwortet
    An sowas hab ich noch gar nicht gedacht. Ich schaue mir json_decode mal genauer an.
    Danke schon mal, auch für das Beispiel. Das sieht auf den ersten Blick wesentlich einfacher aus.

    Einen Kommentar schreiben:


  • BlackScorp
    antwortet
    der String ist doch ein JSON wieso wandelst du es nicht mit json_decode nicht in ein array und dann mit array_filter weiter arbeiten?

    PHP-Code:

    $string 
    ='{"player":{"player_id":1234567,"name":"IchBinEinN4me","avatar":"addon_portrait_id_kimberly","__class__":"BasePlayer"},"expeditionPoints":84304,"solvedEncounters":61,"__class__":"GuildExpeditionContribution"}';

    $data json_decode($string,true);

    $playerId $data['player']['player_id'];
    $expeditionPoints $data['expeditionPoints'];
    $solvedEncounters $data['solvedEncounters'];
    var_dump($playerId); //1234567
    var_dump($expeditionPoints); //84304
    var_dump($solvedEncounters); //61 

    Einen Kommentar schreiben:

Lädt...
X