Ankündigung

Einklappen
Keine Ankündigung bisher.

RegEx: Ausgabe von Elementen eines mittels preg_grep erstelltem Array

Einklappen

Neue Werbung 2019

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

  • RegEx: Ausgabe von Elementen eines mittels preg_grep erstelltem Array

    Hallo,

    ich bin Anfänger was die Nutzung von regulären Ausdrücken anbelangt und habe eine Frage.
    Ich habe eine Beispieldatei erstellt, welche kleingeschriebene Wörter mit 5 Buchstaben enthalten:

    Dateiname: logdatei.txt:

    Inhalt:

    gabel
    fsalfjsdalfjdsl
    255
    dasfjlksdjflksdjlkfj
    bauer
    192
    sauer

    Den Inhalt der Datei lese mittels folgender php-Datei in ein Array $text ein und suche dort nach dem Muster
    $regtest_wort:


    PHP-Code:

      
    if(!file_exists($_POST["dn"]))
           exit(
    "Datei konnte nicht gefunden werden");

       
    $text file($_POST["dn"]);

           echo 
    "<b>Start Ausgabe eingelesener String</b><br>";
        for (
    $i 0$i count($text); $i++)
        echo 
    "$text[$i]<br>";
        echo 
    "<b>Ende Ausgabe eingelesener String</b><br>";

        
    // IPv4 filtern


        
    $regtest_wort "/^([a-z]{5}\s)$/";
        
    $regtest_zahl "/^[1-9]{3}\s$/";

        
    $ergebnisse preg_grep($regtest_wort,$text);

        if (empty(
    $ergebnisse)) echo "Nichts gefunden !!";


        echo 
    "Anzahl Einträge in Array:  ".count($ergebnisse)."<br>";

        for (
    $i 1$i count($ergebnisse); $i++)

        echo 
    "Element".$i.":".$ergebnisse[$i]."<br>"



    Als Ergebnis erhalte ich folgende Ausgabe:

    Start Ausgabe eingelesener String
    Worte mit fuenf buchstaben und der Kombination 3x Zahl 1 bis 9 gefolgt von Punkt:

    gabel
    fsalfjsdalfjdsl
    255
    dasfjlksdjflksdjlkfj
    bauer
    192
    sauer

    Ende Ausgabe eingelesener String
    Einträge in Array: 3

    Notice: Undefined offset: 1 in C:\xampp\htdocs\projekt_2\dateieinlesen.php on line 27
    Element1:
    Element2:gabel


    Frage: Warum wird nur dieses Element "gabel" ausgegeben ?

    Gruß

    Piti






  • #2
    Musst du gar nicht so kompliziert machen

    PHP-Code:
    <?php
    $string 
    '
    gabel
    fsalfjsdalfjdsl
    255
    dasfjlksdjflksdjlkfj
    bauer
    192
    sauer'
    ;

    $regtest_wort "#\b([a-z]{5}\b)#";
    $regtest_zahl "#\b\d{3}\b#";

    preg_match_all$regtest_wort$string$worte);
    preg_match_all$regtest_zahl$string$zahlen);

    foreach (
    $worte[0] as $wort){
        echo 
    $wort "<br>\n";
    }
    echo 
    "Anzahl Einträge in Array: "  count($worte[0]) . "<br><br>\n";

    foreach (
    $zahlen[0] as $zahl){
        echo 
    $zahl "<br>\n";
    }
    echo 
    "Anzahl Einträge in Array: " count($zahlen[0]) . "<br>\n";
    ?>
    \b Wortgrenze
    [a-z] Zeichenklasse findet nur kleine Buchstaben des Alphabets, jedoch keine Grossbuchstaben und keine Umlaute
    \d digit Zahlen von 0-9, du hattest die Null nicht mit dabei

    Kommentar


    • #3
      Hi Protestix,

      vielen Dank für den Tipp mit der Wortgrenze mit \b. Allerding kann ich "pregmatch" so nicht verwenden, dass ich ja in meinem Beispiel Text aus einer Logdatei in ein Array einlesen möchte. So erhalte ich die Fehlermeldung, dass ich einen String statt einem Array übergeben soll.

      Witzigerweise habe ich gerade die Lösung für mein Problem beim Rumtesten gefunden:

      $ergebnisse[] = preg_grep($regtest_wort,$text);

      statt

      $ergebnisse = preg_grep($regtest_wort,$text);


      Ich hatte überhaupt kein Array zu gewiesen sondern eine Variable.....

      Jedenfalls nochmals vielen Dank für die schnelle Hilfe und den Typ mit der Wortgrenze und pregmatch.

      Gruß

      Piti


      Kommentar


      • #4
        Ich hätte noch eine Frage, da sie thematisch weiterhin mit regex zu tun hat, schreibe ich sie einfach mal in diesen Thread rein:

        Ich habe mir eine Beispieldatei für Logdateien heruntergeladen, in welcher nacheinander folgende Einträge gelistet sind:


        91.11.215.221 - - [28/Dec/2015:12:27:50 +0100] "GET /assets/js/jquery.min.js HTTP/1.1" 200 33633 "http://www.inf-schule.de/programmierung/imperativeprogrammierung/konzepteimp/programme/beispiel_wegberechnungen" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"
        91.11.215.221 - - [28/Dec/2015:12:27:51 +0100] "GET /assets/fonts/ptsanscaption_regular/PTC55F-webfont.woff HTTP/1.1" 200 27940 "http://www.inf-schule.de/assets/css/screen.css" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"
        [..]
        PHP-Code:

          
        if(!file_exists("<Name der Logdatei>"]))
               exit(
        "Datei konnte nicht gefunden werden");

           
        $text file("<Name der Logdatei>");




        $regIPV4 "#\b((\d{1,3}\.){2})((\d{1,3}){1})\b#";
        $ergebnisse[] = preg_grep($regIPV4,$text);
        if (empty(
        $ergebnisse)) echo "Keine IPs gefunden ??";
        echo 
        "Einträge in Array:  ".count($ergebnisse[0])."<br>";

        foreach (
        $ergebnisse[0] as $ergebnis)
            {
             echo 
        "Element:".$ergebnis."<br>";
             } 
        Mit dem enthaltenen (groben) RegEx wollte ich nach den IPv4-Adressen in der Logdatei filtern. Da jedes Element der Logdatei die IPv4-Adresse enthält, werden mir alle Zeilen ausgegeben inkl. dem Anhang hinter der IPv4.
        Wie kann man denn hinter diesem RegEx "schneiden", so dass er nur noch die IPv4 des entsprechenden Elemtents / der entsprechenden Zeile ausgibt ?

        Kommentar


        • #5
          Ich hab das mal korrigiert für dich:
          PHP-Code:
          $text[0]='91.11.215.221 - - [28/Dec/2015:12:27:50 +0100] "GET /assets/js/jquery.min.js HTTP/1.1" 200 33633 "http://www.inf-schule.de/programmierung/imperativeprogrammierung/konzepteimp/programme/beispiel_wegberechnungen" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"';
          $text[1]='91.11.215.221 - - [28/Dec/2015:12:27:51 +0100] "GET /assets/fonts/ptsanscaption_regular/PTC55F-webfont.woff HTTP/1.1" 200 27940 "http://www.inf-schule.de/assets/css/screen.css" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"';
          //Natürlich nur zu Testzwecken! ;-)

          $regIPV4 "#\b((\d{1,3}\.){3})((\d{1,3}){1})\b#";

          foreach(
          $text as $logZeile)
          {
              
          $matches=array();
              
          preg_match($regIPV4,$logZeile,$matches);
              
          var_dump($matches[0]);

          Es ausführen und damit spielen kannst du auch direkt hier.

          Kommentar


          • #6
            Der findet aber auch 256.302.398.512, was definitiv kein IP v4 ist!
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar


            • #7
              Zitat von Arne Drews Beitrag anzeigen
              Der findet aber auch 256.302.398.512, was definitiv kein IP v4 ist!
              Ja, klar, es ist halt eine vereinfachte RegEx. Aber in der Logdatei wirst du solche falschen IPs wohl kaum haben.

              Kommentar


              • #8
                Das war als Hinweis gedacht, für diejenigen, die auf der Suche nach einer RegEx für IP Adressen hier landen und das als Lösung verwenden wollen. Das funktioniert aber leider nicht in allen Umgebungen, sondern nur für den hier geschilderten Fall.
                Competence-Center -> Enjoy the Informatrix
                PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                Kommentar


                • #9
                  Dafür gibts dann:
                  PHP-Code:
                  filter_var($ipFILTER_VALIDATE_IP); 

                  Kommentar


                  • #10
                    Siehste, jetzt stehts hier und Suchende finden auch das. So passt das!
                    Competence-Center -> Enjoy the Informatrix
                    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                    Kommentar


                    • #11
                      Hi csabinho,

                      vielen Dank für deine Hilfe. Der Code-Schnipsel mit dem preg_match erfüllt absolut meinen beabsichtigten Zweck.

                      @Arne: Kann man filter_var($ip, FILTER_VALIDATE_IP) auch ein Array mit Strings übergeben ?

                      Gruß

                      Kommentar


                      • #12
                        Zitat von phpeter Beitrag anzeigen
                        Kann man filter_var($ip, FILTER_VALIDATE_IP) auch ein Array mit Strings übergeben ?
                        Nope, dafür gibts filter_var_array!

                        Kommentar

                        Lädt...
                        X