Dateien vergleichen, Abweichungen ausgeben

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

  • Dateien vergleichen, Abweichungen ausgeben

    Hallo Leute

    Ich habe folgendes Vorhaben:

    Es gibt ein par Serverkonfigurationsdateien (.txt Format), welche ich auf meinem PC rumliegen habe. Diese weisen ein par Fehler auf, die ich gerne angezeigt haben möchte.

    Hierfür gibt es auf dem Webspace ebenfalls solch eine Konfigurationsdatei, die komplett fehlerfrei ist.
    Ich würde nun gerne eine Serverconfig von meinem Computer hochladen und vergleichen lassen, um anschliessend die Abweichungen zu der auf dem Webspace angezeigt zu bekommen.

    Die Konfigurationsdateien beinhalten Einstellungen, meist eine pro Zeile. Beispiel: allow_url_include "0"

    Was schon fertiggestellt ist, ist das Formular/phpscript zum uploaden der fehlerhaften Datei sowie die regex Befehle zum auslesen der Werte. Im obigen Beispiel würde z.B. allow_url_include mit dem Wert 0 ausgelesen, allerdings gibt es ca. 40 solcher Zeilen in einer Datei.

    Es geht jetzt darum, wie man die fehlerhafte und die richtige Datei am besten mit regex ausliest und die Werte vergleicht, anschliessend Abweichungen auflistet.

    Zum "herausfischen" der Befehle könnte man vllt sowas benutzen:

    PHP-Code:
    <?php 
    $content 
    = @file_get_contents('server.ini');
      
    $regex '/(\bWertX\b)\s+"?(-?\d+\.\d+|-?\d+)/';
      if (
    preg_match_all($regex,$content,$matches,PREG_SET_ORDER))
      {
        foreach(
    $matches as $match)
        {
        echo 
    '<pre>';
        
    print_r($match);
        echo 
    '</pre>';
        }
      } 
    ?>
    Dann hatte man die Werte der fehlerfreien Datei schonmal in einem Array, man müsste halt WertX stellvertretend für jeden Befehl machen. Das gleiche noch mit der hochgeladenen und dann irgendwie die Array vergleichen, nur wie...

    Oder würdet ihr das komplett anders machen?

    Die Zeilen einer Datei sind übrigens willkürlich angeordnet, Zeile 1 in der fehlerfreien Datei entspricht nicht unbedingt Zeile 1 der fehlerfreien.

    Dankeschön schonmal
    Zuletzt geändert von INC.; 04.08.2006, 18:42.

  • #2
    so in der art könntest das machen

    PHP-Code:
    foreach($datei_eins as $eins_key => $eins_value)
        {
    if (
    $datei_zwei[$eins_key] == $eins_value) { 
    //passt 
    } else { 
    //erzeuge neuen array mit fehlerhaften einträgen...
    }
        } 

    Kommentar


    • #3
      Danke schonmal. Jetzt gibt es noch das Problem, dass der Wert nicht immer nur eins oder null ist, sondern auch einen Wertebereich aufweisen kann (z.b. 5-12) oder alles erlaubt sein soll was größer als ein bestimmter Wert ist.

      Jetzt fragt sich was sinnvoller ist: irgendwie versuchen, einen dynamischen Operator in der If-Abfrage hinzubekommen oder für jede der 3 Möglichkeiten eine eigene Abfrageart zu erstellen.

      Kommentar


      • #4
        Ok ich kann es jetzt etwas präzisieren.

        PHP-Code:
        //Dateien einlesen
            
        $content['validsettings'] = @file_get_contents('checksettings.ini');
            
        $content['invaldsettings'] = @file_get_contents($_FILES['datei']['tmp_name']);
            
            
        //regexkeys bestimmen
            
        $regex['validsettings'] = '/(\w*)\s+"?(-?\d+\.\d+|-?\d+)/';
            
        $regex['invaldsettings'] = '/(\w*)\s+"?(-?\d+\.\d+|-?\d+)/';
            
            
        //Werte aus Dateien auslesen
            
        (preg_match_all($regex['validsettings'],$content['vaildsettings'],$matches_validsettings,PREG_SET_ORDER));
            (
        preg_match_all($regex['invaldsettings'],$content['invaldsettings'],$matches_invaldsettings,PREG_SET_ORDER)); 
        Was ich nicht wusste, diese Variante erstellt mir 2 zweidimensionale Arrays. Geht das trotzdem noch wie von dir vorgeschlagen?

        Was vllt noch zu erwähnen wäre: das erste Element [0] des inneren Arrays kann man eigentlich nicht gebrauchen, da es den gesamten regex match angibt, erst [1] und [2] beinhalten Anweisung und Wert getrennt.
        Zuletzt geändert von INC.; 04.08.2006, 22:00.

        Kommentar


        • #5
          Original geschrieben von INC.
          Was ich nicht wusste, diese Variante erstellt mir 2 zweidimensionale Arrays.
          das ist das normale verhalten von preg_match_all.

          aber warum machst du es dir eigentlich so schwer, ich meine mit regex ... ?

          du brauchst eigentlich nur soetwas:
          Code:
          param1::value1
          param2::value2
          ...
          also, im grunde ein csv-file
          einlesen, am trenner exploden - param als array-key und value als array-value - das für beide dateien und schon kannst du wunderbar vergleichen.

          Kommentar


          • #6
            Es gibt nur keinen Trenner zum exploden, ein Beispiel an der Zeile aus meinem ersten Post oben; die Zeile kann jede folgender Formen haben:

            Code:
            allow_url_include "0"
            allow_url_include "0";
            allow_url_include               "0"
            allow_url_include             "0";
            allow_url_include 0
            allow_url_include 0;
            allow_url_include          0.56564
            allow_url_include           0;


            Und für sowas is regex doch bestens geeignet...
            Die regex "Formel" zum auslesen ist ja auch schon parat und funktioniert perfekt, nur das vergleichen mit php bzw. der Arrays ist ein Problem
            Zuletzt geändert von INC.; 04.08.2006, 23:14.

            Kommentar


            • #7
              ich hätte es zwar anders gelöst, aber wenn du darauf bestehst:

              Code:
              int preg_match_all ( string Suchmuster, string Zeichenkette, array &Treffer [, int Flags [, int Versatz]] )
              das array Treffer ist folgendermaßen aufgebaut:
              Treffer[0] enthält den gesamten ausdruck
              Treffer[1] den ersten geklammerten ausdruck
              Treffer[s] den zweiten geklammerten ausdruck
              ...

              also ein array aus key Treffer[1] und value Treffer[2] erstellen ...
              dazu müsste aber der regex stimmen

              Kommentar


              • #8
                Der Regex stimmt, keine Sorge..

                Meinst also die zweidimensionalen Arrays auseinandernehmen und zu einem eindimensionalen zusammenfügen, unter Ausschluss des gesamten Ausdrucks?

                Kommentar


                • #9
                  ne, brauchst du nicht mal
                  $matches_validsettings[1] ist der parameter
                  $matches_validsettings[2] ist der wert

                  selbiges für $matches_invaldsettings

                  Kommentar


                  • #10

                    Wie kommst du denn da drauf, hast doch selber gesagt es werden 2dimensionale Arrays erstellt.

                    Wenn ich deine Zeilen mit echo ausgeben lasse, erhalte ich als Antwort logischerweise nur "Array".

                    Wenn ich an die Parameter und Werte ran will, brauch ich doch schon
                    PHP-Code:
                    $matches_validsettings[0][1];
                    $matches_validsettings[0][2];

                    //etc... 
                    Oder wie hast du das gemeint?

                    Kommentar


                    • #11
                      sorry, hast recht - es ist aber auch schon spät

                      $matches_validsettings[$i][1];
                      $matches_validsettings[$i][2];

                      $i ist dann der i-te treffer bei 0 beginnend.

                      Kommentar


                      • #12
                        Jo genau so ist es.
                        Aber entweder bin ich auch zu müde, oder ich weis wirklich nicht wie mir das genau weiterhilft in Sachen vergleichen

                        Also wie du gesagt hast mache ich das ganze noch mit dem $matches_invald Array. Dann habe ich

                        $matches_validsettings[$i][1]; für $i beginnend bei 0 und $matches_invalidsettings[$i][1]; ebenso.

                        Nur kann es sein, dass du davon ausgehst, dass jeder Treffer in der einen Datei an der gleichen position ist wie in der anderen und du jetzt einfach immer

                        PHP-Code:
                        if ($matches_validsettings[$i][1] != $matches_invalidsettings[$i][1]) //..... 
                        machen wolltest?

                        Habe ja oben geschrieben, dass die Inhalte der beiden Dateien leider nicht gleich angeordnet sind, so würde ich ziemlich schnell 2 unterschiedliche Parameter miteinander vergleichen...


                        Gute Nacht

                        Kommentar


                        • #13
                          Original geschrieben von 3DMax
                          $matches_validsettings[$i][1];
                          $matches_validsettings[$i][2];
                          $i ist dann der i-te treffer bei 0 beginnend. [/B]
                          das ist natürlich auch blödsinn! $i und int müssen vertauscht sein.
                          ich lege mich jetzt wirklich hin
                          schreibe vielleicht morgen etwas gescheites dazu

                          Kommentar


                          • #14
                            so, ich nochmal.
                            also, zwei arrays mit key=parameter und value=wert machen und die dann vergleichen.
                            hoffe, das passt jetzt:
                            PHP-Code:
                            $new_matches_validsettings=array();
                            for(
                            $i=0$i<count($matches_validsettings[0]); $i++)
                             
                            $new_matches_validsettings[$matches_validsettings[1][$i]]=$matches_validsettings[2][$i]; 

                            Kommentar


                            • #15
                              jap so hatte ich es auch gemacht, leider wird aber trotz Schleife nur ein Parameter und Wert eingelesen statt alle.

                              edit: achso, für mehrdimensionale Array braucht man den Parameter COUNT_RECURSIVE.

                              edit2: geht immer noch nicht, aber bei der Zeile unter der Schleife wird bei jedem Durchlauf ja auch nur das $i erhöht, nicht die Zahl davor..
                              Zuletzt geändert von INC.; 05.08.2006, 11:37.

                              Kommentar

                              Lädt...
                              X