Ankündigung

Einklappen
Keine Ankündigung bisher.

Regex und Lookarounds

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

  • 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


  • #2
    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 
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp

    Kommentar


    • #3
      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.

      Kommentar


      • #4
        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

        Kommentar


        • #5
          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.
          "Software is like Sex, it's best if it's free." - Linus Torvalds

          Kommentar


          • #6
            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".
            You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

            Kommentar


            • #7
              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

              Kommentar


              • #8
                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.
                You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

                Kommentar


                • #9
                  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...

                  Kommentar

                  Lädt...
                  X