IP aus Text herausfiltern

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Till P.

Betreff: IP aus Text herausfiltern

BeitragFr, März 23, 2007 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Allerseits!
Nach langer Zeit wende ich mich auch mal wieder an euch, hab nämlich ein Problem, das ich scheinbar alleine nicht lösen kann. Sad

Folgendes:
Ich möchte aus einer beliebigen Textzeile eine IP "herausfiltern"!

Beispiel:
kjlkjsd098>.yx:--.msdflLKesd219.13.45.81lksdl.<sd<scxvsdf

Es muss also folgendes geschehen:
1. Überprüfen, ob eine IP in dem Text steckt
2. Position und Länge herausfinden
3. Herauskopieren

Mein Problem liegt bei 1. obwohl ich schon recht weit bin, finde ich Wink :
1. Ich suche nach einem Punkt in der Zeit --> Instr()
2. Ich überprüfe, ob direkt neben dem Punkt eine Zahl steht --> 2 Mal Mid()
3. Ich überprüfe, ob innerhalb der nächsten 4 Zeichen ein Punkt vorhanden ist
4. Ich führe diese Schritte auch für Punkt 2 und 3 in der Zeile durch.

Code: [AUSKLAPPEN]
   If pos1=0 Then pos1=Instr(txt,".")
   If pos1<>0 Then
      If number(Mid(txt,pos1-1,1)) Then
         If number(Mid(txt,pos1+1,1)) Then
            txtlevel=1
            Exit
         EndIf
      EndIf
    Else ;If pos1=0
      Exit
   EndIf
   
   If txtlevel=1 Then
      pos2=Instr(txt,".",pos1+1)
      If pos2<>0 Then
         If number(Mid(txt,pos2-1,1)) Then
            If number(Mid(txt,pos2+1,1)) Then
               txtlevel=2
               Exit
            EndIf
         EndIf
       Else ;if pos2=0
         Exit
      EndIf
   EndIf
   
   If txtlevel=2 Then
      pos3=Instr(txt,".",pos2+1)
      If pos3<>0 Then
         If number(Mid(txt,pos3-1,1)) Then
            If number(Mid(txt,pos2+1,1)) Then
               txtlevel=3
               Print txt
               Exit
            EndIf
         EndIf
       Else ;if pos3=0
         Exit
      EndIf
   EndIf


Ich hoffe das ist einigermaßen nachvollziebar.

Mein Problem:
Sobald ein Punkt vor, aber unabhängig von der IP-Adresse in der Zeile erscheint (s.o.), der nicht von 2 Zahlen eingeschlossen ist, wird die ganze Zeile aussortiert.

Habt ihr 'ne Lösung oder einen Lösungsansatz?
Für ein Codebeispiel wäre ich sehr dankbar, ich steck ich echt fest!

Vielen Dank schonmal im Voraus!
Till

Markus2

BeitragFr, März 23, 2007 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Als erstes würde ich alles aus dem String übernehmen
was ne Zahl und nen Punkt ist .

kjlkjsd098>.yx:--.msdflLKesd219.13.45.81lksdl.<sd<scxvsdf
=
098..219.13.45.81.

Dann Zahlen suchen die mit Punkt enden und danach wieder
ne Zahl kommt und wenn das nicht der Fall ist den kram den
man gefunden hat aus dem String entfernen

098
.
. <- keine Zahl

Weiter suchen

219.13.45.81.
 

Till P.

BeitragFr, März 23, 2007 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die sehr schnelle Hilfe Wink, werd's mal eben probieren...
 

Yogu

BeitragFr, März 23, 2007 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist:
219.dafe13.f45d.81dfasd
wird zu
219.13.45.81
obwohl das eigentlich keine IP ist, oder?
www.yogularm.de/df/design/signature.png

Markus2

BeitragFr, März 23, 2007 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
@Yogu
das sieht auch nicht wie das Beispiel oben aus .
Für jeden neuen Fall muß man wohl tricksen
und glück haben das man alles unter ein Hut bekommt Smile
 

Dreamora

BeitragFr, März 23, 2007 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur wenn dein Parser falsch ist.

Was du machen musst ist ein IP String an legen, für jede folge, wo nur zahlen und punkt drin vor kommen.

Sobald ein buchstabe kommt kommen die darauf folgenden zahlen und punkte wieder in einen eigenen string
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragFr, März 23, 2007 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mal schnell einen geschrieben, hat aber noch einen Fehler den ich noch nicht berücksichtigt habe
Der Code gibt auch 4-Stellige Zahlen als IP aus.
2110.12.45.0
Muss halt noch eine zusätzliche Abfrage rein.

Code: [AUSKLAPPEN]
Print GetIP ("219.13.45.81")
Print GetIP ("kjlkjsd098>.yx:--.msdflLKesd219.13.45.81lksdl.<sd<scxvsdf ")

WaitKey

Function GetIP$ (Zeile$)
    Zeile$ = Zeile +"#" ;Die Var Zeile darf nicht mit der IP enden
    For i = 1 To Len (Zeile$)
        Letter$ = Mid (Zeile$,i,1)
       
        If Instr (".0123456789 ",Letter$) Then
            Dummy$ = Dummy$ + Letter$
           
         Else
            ;prüfen ob es eine IP ist! (min. 3 Punkte innerhalb der Zahlen)
            If Len (Dummy) - 3 >= Len (Replace (Dummy,".","") ) Then
                ;alle Punkte und Leerzeichen vorne löschen
                While Left (Trim (Dummy$) ,1) = "." : Dummy$ = Mid (Trim (Dummy$) ,2) : Wend
                ;alle Punkte und Leerzeichen hinten löschen
                While Right (Trim (Dummy$) ,1) = "." : Dummy$ = Left (Trim (Dummy$) ,Len (Trim (Dummy) ) - 1) : Wend
                ; Prüfen ob es eine IP ist
                If Len (Dummy) - 3 = Len (Replace (Dummy,".","") ) Then Return Dummy$
            End If
            Dummy$ = ""
        End If
    Next
   
    Return "Not IP found"
   
End Function
[BB2D | BB3D | BB+]

Jolinah

BeitragFr, März 23, 2007 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde das ungefähr so machen:

Benötigt:

- Ein Zähler, der das aktuelle IP-Segment festhält.
- Ein String-Array mit 4 Elementen für die einzelnen Segmente


Vorgang:

- Zeichenweise den String durchgehen:

- Ist es eine Zahl:
---> Wenn die Länge des aktuellen Segments kleiner als 3 ist, so wird die Zahl dem aktuellen Segment hinzugefügt.
---> Ansonsten: Ist das letzte Segment aktiv, so haben wir unsere IP -> Exit. Sind wir nicht beim letzten Segment so ist die IP nicht gültig (mehr als 3 Zahlen in einem Segment) -> Segment auf das erste setzen, und das erste Segment auf Leerstring setzen.

- Ist es ein Punkt:
---> Wenn im aktuellen Segment schon etwas steht, dann wird das Segment um 1 erhöht und das Segment auf Leerstring gesetzt. Ist das Segment nach dem erhöhen zu gross (wir haben nur 4) dann haben wir die IP -> Exit.

- Bei jedem anderen Zeichen:
---> Sind wir beim letzten Segment und dort steht auch schon was drin, dann haben wir unsere IP -> Exit.
---> Ansonsten ist die IP nicht gültig -> Segment auf 0 setzen, aktuelles Segment auf Leerstring setzen.


Am Ende kann die IP aus den einzelnen Segmenten zusammengesetzt werden. Wahrscheinlich gibt es effizientere Methoden, aber das war halt so meine erste Idee Wink

Hier ein Beispiel in BMax (sollte aber leicht nach BB zu portieren sein):
Code: [AUSKLAPPEN]
SuperStrict

Local text:String = "kjlkjsd098>.yx:--.msdflLKesd219.13.45.81lksdl.<sd<scxvsdf"

Local seg:Int = 0
Local segmente:String[4]
Local IP:String = ""

For Local i:Int = 1 To Len(text)
   Local c:String = Mid(text, i, 1)

   Select c
      Case "0","1","2","3","4","5","6","7","8","9"
         If Len(segmente[seg]) < 3
            segmente[seg] :+ c
         Else
            If seg = 3 Then Exit
            seg = 0
            segmente[seg] = ""
         EndIf
      
      Case "."
         If Len(segmente[seg]) > 0
            If seg < 3 Then
               seg :+ 1
               segmente[seg] = ""
            Else
               Exit
            EndIf
         EndIf
         
      Default
         If seg = 3 And Len(segmente[seg]) > 0 Then Exit
         seg = 0
         segmente[seg] = ""
   End Select
Next

IP = segmente[0] + "." + segmente[1] + "." + segmente[2] + "." + segmente[3]

Print IP

End


Weiterhin müsste man noch prüfen ob eines der Segmente > 255 ist, weil das bei einer IP ja auch nicht erlaubt ist. Aber das dürfte nicht so schwer zu realisieren sein Wink

Silver_Knee

Betreff: Klogriff methode

BeitragSa, März 24, 2007 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Print FindIP("kjlkjsd098>.yx:--.msdflLKesd219.13.45.81lksdl.<sd<scxvsdf ")
Function FindIP$(txt$)

For erste=0 To 225
For zweite=0 To 255
For dritte=0 To 255
For vierte=0 To 255
 If Instr(txt,erste+"."+zweite+"."+dritte+"."+vierte)
  Return erste+"."+zweite+"."+dritte+"."+vierte
 Endif
Next
Next
Next
Next

End Function

Simpel dürfte aber funktionieren

Vertex

BeitragSa, März 24, 2007 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
FTC: dir ist schon klar, dass der im schlimmsten Fall über 4 Milliarden Durchläufe macht?

Das Verfahren, wie Jolinah es beschrieben hat, ist am besten. Ob bewusst oder unbewusst, er matched hier einen regulären Ausdruck á la
Code: [AUSKLAPPEN]
([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})


In PHP würde man es mit ereg o.ä. machen, in BlitzBasic muss man es selber parsen.

mfg olli
vertex.dreamfall.at | GitHub

Silver_Knee

BeitragSa, März 24, 2007 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ist mir klar ich sag doch klogriff methode..... mit nem "Loading..."-bildschirm........ Nein ist schon klar (4.294.967.296)... Das von Jolinah ist eindeutig besser

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group