Ankündigung

Einklappen
Keine Ankündigung bisher.

.ini-Datei auslösen ohne Verlust der Kommentare

Einklappen

Neue Werbung 2019

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

  • .ini-Datei auslösen ohne Verlust der Kommentare

    Hi,
    ich stehe im Moment vor einem Problem: für mein aktuelles Projekt habe ich eine Klasse, mit der man .ini-Dateien in PHP auswerten und editieren kann.
    Das Einlesen ist einfach, dafür gibt es schließlich parse_ini_file(), aber die Datei zu aktualisieren erwies sich als schwieriger.
    Bisher habe ich das immer gelöst, in dem ich mit zwei verschachtelten foreach-Schleifen das Array mit den Daten in einen String nach der MS INI-Syntax umgewandelt. Mit diesem String habe ich dann die aktuelle Datei überschrieben.

    Das Problem dabei war, dass dabei jedes Mal alle Kommentare verloren gingen, da diese ja bei parse_ini_file() nicht mitgeparst wurden und ich die neue Datei nicht auf Basis der Alten erstellte, sondern aus dem Array rekonstruierte.

    Jetzt habe ich das ganze etwas verändert:
    PHP-Code:
        public function saveIni()
        {
            
    $text file_get_contents($this->ini_file);
            foreach(
    $this->ini_last as $key=>$value)
            {
                
    $text preg_replace("#$key = (([A-Z]|[a-z]|[0-9]|\"|[#'./-_*]|\\)*\n)#",
                                     
    "$key = $value\n",
                                     
    preg_quote($text));
            }
            
    file_put_contents($this->ini_file);
        } 
    Das Array $this->ini_last enthält alle veränderten Eigenschaften zur letzten Version. Das Problem bei dieser Methode liegt jedoch bei den Regexp, denn es tritt folgender Fehler auf:
    Code:
      preg_replace() [function:preg-replace]: Unknown modifier '''
    Das liegt soweit ich weiß an $text, dass er dort irgendwie auch noch modifiern sucht. Ich habe sowohl preg_quote als auch addslashes ausprobiert, der Fehler blieb.
    Weiß jemand, was ich da falsch mache oder wüsste eine bessere Methode, bei der die Kommentare erhalten bleiben?

    MfG dying_hero


  • #2
    Wenn du preg-Funktionen benutzt, musst du immer ganz am Anfang und ganz am Schluss einen Slash sprich / machen. Sonst kapiert der nicht, dass es sich um ne Regexp handelt.

    Kommentar


    • #3
      Hatte ich auch schon, da kam genau das gleiche raus
      Das einzige was sich da ändert ist, dass die Fehlermeldung nicht mehr 'Unknown Modifiere ''' heißt, sondern unknown modifier '-'. Aber kann man als Delimiter nicht jedes beliebige Sonderzeichen verwenden?
      Trotzdem danke für deine Hilfe.

      MfG dying_hero

      Kommentar


      • #4
        Hallo!

        Ich weis nicht ob es daran liegt aber du benutzt als delimiter ein # Zeichen!
        Und in deinem Regex auch. Mache mal davor eine Bacjslash. Denn verwendest du im Regex Zeichen die du als Delimiter nutzt musst du die im Regex backslashen.

        Und nicht jedes beliebige Zeichen darfst du nutzen es gibt Ausnahmen die man nicht dazu nehmen darf!

        [Edit]
        Nur ein Backslash darf nicht als delimiter genutzt werden und keine Alphanumerischen Zeichen
        [/Edit]
        Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
        http://www.lit-web.de

        Kommentar


        • #5
          Ja, das mit dem # oder / macht keinen Unterschied.
          ABer soweit ich weiß müssen diese Zeichen innerhalb von [] nicht in backslashes stehen, weil dort drin den Sonderzeichen ihre Wirkung genommen wird. Vielleicht liege ich da auch falsch, aber ich glaube, ich habe das mal irgendwo gelesen.

          MfG dying_hero

          Kommentar


          • #6
            Ich sagte ja ich weis das auch nicht so genau aber ich denke ich habe das gelesen das die Zeichen die man als Delimiter verwendet dann im Regex mit Backslash versehen werden müssen!
            Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
            http://www.lit-web.de

            Kommentar


            • #7
              Du kannst auch einfach PEAR :: Package :: Config verwenden.


              Du musst für preg_match ein Zeichen als Trenner wählen, das sonst nicht in Deinem Ausdruck vorkommt (oder \ verwenden)
              #$key = (([A-Z]|[a-z]|[0-9]|\"|[#'./-_*]|\\)*\n)# geht nicht
              -$key = (([A-Z]|[a-z]|[0-9]|\"|[#'./-_*]|\\)*\n)- geht nicht
              !
              $key = (([A-Z]|[a-z]|[0-9]|\"|[#'./-_*]|\\)*\n)! funktioniert

              Kommentar


              • #8
                Sorry, habe übersehen, dass du # als Delimiter verwendest. Aber die Aussage, dass alle Sonderzeichen zwischen [] ihre Wirkung verlieren, ist falsch. Deshalb kommt ja auch die Fehlermeldung, dass das Apostroph ' kein bekannter Modifier ist. Die Modifier stehen ja immer nach dem abschliessenden Delimiter
                => preg interpretiert das zweite # bereits als Delimiter und ist dann verwirrt
                => Backslash vor das mittlere # machen.

                Kommentar


                • #9
                  Ah okay. Ich hatte gedacht innerhalb von [] zählt das nicht.
                  So, kleiner Fortschritt, klappt leider immer noch nicht ganz:
                  Code:
                  Compilation failed missing ) at offset 48
                  Nochmal thx an alle die mir bisher geholfen haben

                  Kommentar


                  • #10
                    Ich will mich nicht zu weit aus dem Fenster lehnen aber ich denke du musst noch einen Modifier am Ende deines Regex wählen!

                    Gucke mal hier Reguläre Ausdrücke PHP Script resource Tutorials, Workshops und Artikel
                    Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                    http://www.lit-web.de

                    Kommentar


                    • #11
                      Macht keinen Unterschied. Er bleibt bei der obigen Fehlermeldung.

                      Hier mal der aktuelle Quellcode, vielleicht übersehe ich einfach irgendwas:
                      PHP-Code:
                              $text file_get_contents($this->ini_file);
                              foreach(
                      $this->ini_last as $key=>$value)
                              {
                                  
                      $text preg_replace("!$key = (([A-Z]|[a-z]|[0-9]|\"|[#'./-_*]|\\)*\n)!Usm",
                                                       
                      "$key = $value\n",
                                                       
                      preg_quote($text));
                              } 

                      Kommentar


                      • #12
                        Hmm was mir auch auffält das du das regex ziemlich kompliziert schreibst!

                        Warum zwischen [] immer ein Varianten | ?

                        Brauchst du nicht wenn du am Ende den Modifier i verwendest das bedeutet er macht kein Unterschied zwischen groß und kleinschreibung!

                        PHP-Code:
                        $text preg_replace("!$key = (([a-z0-9]\"|[#'./-_*]|\\)*\n)!Usmi",
                                                         
                        "$key = $value\n",
                                                         
                        preg_quote($text)); 
                        So kannst den verkürzen
                        Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                        http://www.lit-web.de

                        Kommentar


                        • #13
                          Usmi ist natürlich etwas weniger sinnvoll, aber danke für den Tipp. Ich hab noch relativ wenig Praxis mit Regex (mal einen kleinen BB-COde-Parser gecdet, sonst nichts) und in dem Tutorial, wo ich das herhab werden die Teile nur einzeln durchgenommen und nicht in Kombination.

                          DIe Fehlermeldung sieht jetzt schon wieder anders aus, leider habe ich keinen Plan was das bedeuten könnte:
                          Code:
                          Compilation failed: nothing to repeat at offset 36

                          Kommentar


                          • #14
                            Wie die Fehlermeldung aussagt, hast du in der Regex mehr Klammern geöffnet als geschlossen. Nämlich am Anfang 2 (warum auch immer) und am Schluss nur eine.

                            Modifier sind nicht zwingend notwendig. Aber bei normalen Text macht i (case insensitive) oftmals Sinn, dann muss man nicht immer A-Za-z schreiben, sondern eins davon reicht.

                            Kommentar


                            • #15
                              Ah ja danke, komplett übersehen (das ist die automatische Klammer-Funktion von meinem Editor). Jetzt liefert er mir immerhin keine Fehlermeldung mehr, aber das gewünschte Ergebnis kommt dennoch nicht heraus.

                              Das ist der Code der Funktion:
                              PHP-Code:
                                  public function saveIni()
                                  {
                                      
                              $text file_get_contents($this->ini_file);
                                      foreach(
                              $this->ini_last as $key=>$value)
                                      {
                                          
                              $text preg_replace("!$key = (([0-9a-z]|\"|[#'./-_*]|\\)*))\n!Usi",
                                                               
                              "$key = $value\n",
                                                               
                              $text);
                                      }
                                      echo 
                              "<b>" nl2br($text) . "</b>";
                                  } 
                              und das die (beispiel)-INI-Datei
                              Code:
                              test-ini = a
                              wenn ich nun für $key test-ini und für $value a einsetze, ändert sich nichts an der ausgabe obwohl es das eigentlich tun sollte.

                              Vielen Dank

                              MfG dying_hero

                              Kommentar

                              Lädt...
                              X