IP aus Text herausfiltern
Übersicht

Till P.Betreff: IP aus Text herausfiltern |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die sehr schnelle Hilfe ![]() |
||
Yogu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() |
||
![]() |
Silver_KneeBetreff: Klogriff methode |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group