Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] preg_match nach IP Adressen innerhalb eines Textes

Einklappen

Neue Werbung 2019

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

  • [Erledigt] preg_match nach IP Adressen innerhalb eines Textes

    Moin,

    meine HA lautet:
    "Finden Sie alle IP Adressen innerhalb des Textes und prüfen Sie diese auf Gültigkeit"

    Beispiel:
    Code:
    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
     eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
     vol127.0.0.1uptua. At vero eos et accusam et justo
     duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus
     est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur 
    sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore
     magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo
     duo dolores et ea rebum. 192.168.0.10 Stet clita 
    kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit 
    am37.1.4.256et.
    preg_match behersche ich aktuell am besten. Wie man sieht, ist die IP Adresse mal in einen Wort versteckt... mal steht es auch einzeln.

    Es geht mir garnicht mal sosehr um die prüfung der IP Adresse selbst... sondern eher darum, an diese ranzukommen.

    Folgendes blieb bisher ohne Erfolg.

    PHP-Code:
    $valid preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/'$text);

    $valid preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/'$text);

    $valid preg_match('/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/'$text); 

    Hat einer Rat ?

  • #2
    Das "^" und "$" zeigt mir, dass du die Pattern einfach nur kopiert hast ohne darüber nachzudenken.

    Kommentar


    • #3
      Bezüglich Validierung: Siehe filter_var und FILTER_VALIDATE_IP - nicht irgendwas selber basteln oder irgendwas von jemand anderem selber gebasteltes ergoogeln.

      Kommentar


      • #4
        Naja die Fragestellung ist in dem Fall schon problematisch: "Finden Sie alle IP Adressen innerhalb des Textes und prüfen Sie diese auf Gültigkeit". Eine IP-Adresse die nicht gültig ist, ist keine IP-Adresse.

        Konkret wird's bei Beispiel 3, wo man entweder 37.1.4.25 matcht oder 37.1.4.256 und dann sagt das sie ungültig ist.

        Kommentar


        • #5
          Stimmt, streng genommen könnte man argumentieren, die Gültigkeit sei schon durch die Prämisse, das gefundene sei eine IP, impliziert.

          Kommentar


          • #6
            also aktuell versuche ich erstmal an die IP Adressen selbst ranzukommen.
            Das auswerten, ob diese gültig ist, wäre dann Schritt 2

            Aktuell sollte das am besten klappen:
            Code:
            print_r(preg_match('/^(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})$/', ....
            Sprich: Suche nach Zahl, die 1-3 Stellig sein darf... und das ganze 4mal hintereinander, .... jeweils getrennt mit einen .

            Nur ich bekomme ich immer 0 zurück... also muß meine Suchanfrage ja falsch sein

            Kommentar


            • #7
              Weil du nicht überprüfst, ob das Pattern im String vorkommt, sondern ob es diesem in seiner Gesamtheit entspricht.

              Tropi hat dich bereits auf die richtige Spur gebracht.

              Außerdem ist eine der Adressen, die du in deinem Beispiel gehighlightest hast, keine gültige IPv4-Addresse.
              Zitat von nikosch
              Naja, anscheinend spricht die Steckdose kein HTTP. LOL

              Kommentar


              • #8
                Das von Tropi hab ich verstanden. Es handeln sich auch um die IP Adressen die in der Aufgabe drin stehen... nur dem lorem ispan text hab ich ersetzt... weil ich es nicht genau abtippen wollte.

                Ich denke mal, dass das was Tobi erwähnt hat gewollt ist.
                Sprich: ich muß ein regulären Ausdruck finden, der erstmal auf xxx.xxx.xxx.xxx passt. x = symboliert hier eine Zahl.
                Wie ich vorher schon geschrieben habe, sollte "(\d{1,3})." das genau tun.
                Leider bekomme ich hier nichts zurück.

                Nun hab ich die Tante Googel schon belästigt und hab dazu noch was besseres gefunden:
                Code:
                ((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}((25[0-5])|(2[0-4][0-9])|(1?[0-9][0-9]?))
                Nur bekomm ich hier gleich mal n "Warning: preg_match(): Unknown modifier '{'" zurück.

                KAnn keiner Helfen, wo mein Denkfehler liegt ?

                Kommentar


                • #9
                  haaaabssss

                  PHP-Code:
                  preg_match_all('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/'$neue_liste$matches); 

                  Kommentar


                  • #10
                    edit: Deine Lösung ist falsch. 37.1.4.256 ist keine IP-Addresse.


                    Funktioniert hier.

                    Der Ausdruck, den du zuletzt (vorletzt nach letztem Post) gepostet hast funktioniert.

                    Hat allerdings immernoch das Problem, das die Aufgabe ansich nicht wirklich gut gestellt ist und du entscheiden musst, ob du "37.1.4.256" komplett rausfallen lässt (da es keine valide IP-Adresse ist), oder nur "37.1.4.25" verwendest.

                    Code:
                    D:\blub\blah>php test.php
                    array(7) {
                      [0]=>
                      array(3) {
                        [0]=>
                        string(9) "127.0.0.1"
                        [1]=>
                        string(12) "192.168.0.10"
                        [2]=>
                        string(9) "37.1.4.25"
                      }
                      [1]=>
                      array(3) {
                        [0]=>
                        string(2) "0."
                        [1]=>
                        string(2) "0."
                        [2]=>
                        string(2) "4."
                      }
                      [2]=>
                      array(3) {
                        [0]=>
                        string(1) "0"
                        [1]=>
                        string(1) "0"
                        [2]=>
                        string(1) "4"
                      }
                      [3]=>
                      array(3) {
                        [0]=>
                        string(1) "1"
                        [1]=>
                        string(2) "10"
                        [2]=>
                        string(2) "25"
                      }
                      [4]=>
                      array(3) {
                        [0]=>
                        string(0) ""
                        [1]=>
                        string(0) ""
                        [2]=>
                        string(0) ""
                      }
                      [5]=>
                      array(3) {
                        [0]=>
                        string(0) ""
                        [1]=>
                        string(0) ""
                        [2]=>
                        string(0) ""
                      }
                      [6]=>
                      array(3) {
                        [0]=>
                        string(1) "1"
                        [1]=>
                        string(2) "10"
                        [2]=>
                        string(2) "25"
                      }
                    }
                    Zitat von nikosch
                    Naja, anscheinend spricht die Steckdose kein HTTP. LOL

                    Kommentar


                    • #11
                      Welche Aussagen kann man im ersten Schritt über IP-Adressen treffen?
                      Es sind immer 4 Zahlenreihen und 3 Punkte vorhanden.
                      Eine Zahlenreihen bestehen aus min. 1 und max 3 Zahlen.

                      Das wäre ein kleiner erster Schritt:
                      PHP-Code:
                      <?php
                      $text 
                      "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
                       eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
                       vol 992.221.0.1 uptua. At vero eos et accusam et justo 192.128.128.128
                       duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus am37.1.4.256et
                      "
                      ;
                      $suchmuster '/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/';
                      preg_match_all($suchmuster$text$treffer); 
                      print_r($treffer);
                      Du hast jetzt alle Zahlen, die die Bedingung oben erfüllen, gefunden.
                      Nun kommt Dein nächster Schritt:
                      Jeder Zahlenblock darf nur im Bereich von 0 - 255 liegen.
                      Dann kannst Du alle gültigen IP-Adressen aus einem Text fischen und
                      bist nahe an der Lösung dran.

                      Kommentar


                      • #12
                        Zitat von Suralc Beitrag anzeigen
                        Hat allerdings immernoch das Problem, das die Aufgabe ansich nicht wirklich gut gestellt ist und du entscheiden musst, ob du "37.1.4.256" komplett rausfallen lässt (da es keine valide IP-Adresse ist), oder nur "37.1.4.25" verwendest.
                        So was wie "37.1.4.256" und "937.1.4.8" sollte m.E. komplett rausfallen.
                        Die Variante 3 im Eingangspost ist doch eine gute Basis. Sie ist durch die Anfangs- und Endekennung jedoch nur auf die Prüfung von nur einer IP ausgelegt.
                        Um das Problem zu lösen, kann mit einer negative look-behind Assertion und einer negative look-ahead Assertion anstelle der Anfangs- und Endekennung gearbeitet werden.

                        LG jspit

                        Kommentar

                        Lädt...
                        X