IP Address Validator

fnatichohn

Cadet 3rd Year
Registriert
Nov. 2006
Beiträge
35
Hey!

Ich bin auf der Suche nach einem IP Address Validator. Im Internet habe ich schon reichlich zu dem Thema gefunden doch irgendwie komme ich nicht weiter.

Habe in InfoPath ein Formular erstellt. In einem Feld soll der User eine IP Adresse eintragen. Mein Validator soll nun sagen, ob es sich hierbei um eine richtige oder falsche IP Adresse handelt. Also vier Zahlengruppen mit Zahlen von 0 bis 255.

Könnt ihr mir helfen und erklären wie ich so etwas machen kann?

thx im Vorraus
fnatichohn

edit: Welche Programmiersprache verwendet wird ist mir eigentlich egal, da es auf dem Formular keine anderen Programmierungen geben wird.
 
Zuletzt bearbeitet:
Wenn nur um die Überprüfung als solches geht ists recht einfach und schnell geschrieben... Nimm die ganze IP als String und zerpflücke ihn von "." zu ".". Dann lässt du dir die int-Repräsentation des Wertes geben und prüfst mit einer Kontrollabfrage ob der Wert im Bereich von >0 und <266 liegt. Rückgabewert wahlweise, hier würde sich aber wohl boolean anbieten, bzw. keiner und nur eine MessageBox mit dem Ergebnis der Validierung...

In welcher Sprache du das codest ist rel. egal... Ist wirklich ein sehr einfaches Konstrukt.
 
Könntest du mir das ein weniger genauer erklären? Habe leider nur sehr geringe Programmierkenntnisse. Vielen Dank schon mal für deine Hilfe!

edit: Gut wärs auch wenn der Benutzer nur Zahlen eingeben muss und die Punkte automatisch gesetzt werden. Das Validieren ist aber vorrangig.
 
Zuletzt bearbeitet:
PHP:
unset($error);

// String nach "." zerpflücken
$ip = "244.0.0.1";
$array = explode(".",$ip);  

// Array durchlaufen und jeden Zahlenblock checken
foreach($array AS $value) {
if($value > 255) { $error = " ist keine gültige IP"; } 
echo $value.".";
}

if(isset($error)) { echo $error; } 
else { echo "ist eine gültige IP"; }

Falls du exec-Zugriff hast kannst du per ping prüfen, ob die IP online ist:

PHP:
// String nach "." zerpflücken
unset($error);
$ip = "127.0.0.1";
$array = explode(".",$ip);  

// Array durchlaufen und jeden Zahlenblock checken
foreach($array AS $value) {
if($value > 255) { $error = " ist keine gültige IP"; } 
echo $value.".";
}

if(isset($error)) { echo $error; } 

else { echo "ist eine gültige IP und"; 

$exec = true;
// Pingen der IP mit anschliessender auswertung
if($exec) exec("ping $ip -n 1", $array, $return);
else system("ping $ip -n 1", $return);

// Vergleich der Werte
if($return) print " ist offline";
else print " ist online";
}
 
Zuletzt bearbeitet:
Welche Programmiersprache muss ich dafür vorher auswählen?
Dann mit Rechts auf das Textfeld klicken und On Validate Ereignis auswählen?
 
Das ist PHP Code. Vielleicht solltest du uns genauer erklären welche Software und Sprachen du zur Verfügung hast.
 
InfoPath benutze ich. Dort möchte ich, dass der Benutzer auf einem Formular in ein Textfeld eine IP Adresse eingibt. Es soll nur getestet werden ob die vom Format her richtig ist, nicht ob das sein seine eigene ist.

In InfoPath hab ich folgende Programmiersprachen zur Auswahl:
JScript
VBScript
C#
Visual Basic
 
Also eine Überprüfung könnte in Java etwa so aussehen:

Code:
import java.util.ArrayList;

public class Validation {
	
	public static void main(String[] args) {
		System.out.println(validate("123.456.789.012"));
		System.out.println(validate("255.255.255.255"));
		System.out.println(validate("0.0.0.0"));
	}
	
	/**
	 * Ueberprueft ob der uebergebene String die Form "x.x.x.x.x.." hat, wobei
	 * x eine Zahl zwischen 0 und 255 sein muss. Die Anzahl der x-e spielt dabei
	 * keine Rolle ob wahr oder falsch zurueckgegeben wird.
	 * 
	 * @param s
	 * @return
	 */
	public static boolean validate(String s) {
		
		ArrayList<String> sArrayList = splitAtPoints(s);
		
		for(int i = 0; i < sArrayList.size(); i++) {
			
			int j = Integer.valueOf(sArrayList.get(i));
			
			if(j < 0 || j > 255) {
				return false;
			}
		}
		return true;
		
	}
	
	/**
	 * Teilt einen String an seinen Punkten auf und gibt die Teile als ArrayList
	 * zurueck.
	 * 
	 * @param s
	 * @return
	 */
	private static ArrayList<String> splitAtPoints(String s) {
		
		ArrayList<String> parts = new ArrayList<String>();
		int pos = 0;
		
		for(int i = 0; i < s.length(); i++) {
			if(s.charAt(i) == '.') {
				parts.add(new String(s.substring(pos, i)));
				pos = i+1;
			}
		}
		parts.add(new String(s.substring(pos, s.length())));
		
		return parts;
	}
}

Das nur als Anregung, das ist keine vollständige Lösung. Hier wird nur an den Punkten aufgeteilt und dann geprüft ob die einzelnen Segmente zwischen 0 und 255 liegen. Fehlerfälle werden auch nicht behandelt also solltest du das benutzen Fehlerfälle bedenken.

(Diese Implementierung gibt zB auch bei "0.0.0.0.0.0.0" true zurück, da sie nur die Teile anguckt, nicht aber wieviele)

Gruß,
Bender


/edit

Oh ok also scheinbar hat sich das schon erledigt. Im Anfangspost sah es so aus als suchtest du eine Methode irgendeiner x-beliebigen Programmiersprache die die Zahlen überprüft.
 
Wenn ich das mit Java einbaue kann mein Formular irgendwie nicht mehr geöffnet werden. -.-

edit: Naja Java steht mir ja auch zur Verfügung. Ich muss bloß wissen wie ich das in InfoPath gemacht wird. Muss ja auch irgendwie eine Fehlermeldung ausgegen werden.
 
Äh ja ich hab dein Problem wohl etwas falsch verstanden. InfoPath sagt mir nichts, ich dachte das gehört irgendwie in eine Anwendung. Das was ich gepostet hab ist halt eine Java Klasse wo du eine validate Methode hast der du den String geben kannst und die dann zurückgibt ob es ein gültiger ist oder nicht. (Wobei die Gültigkeit nicht komplett überprüft wird und noch ausgebaut werden müsste, war nur als Anregung gedacht)
 
Mir gehts ähnlich wie Bender... Hab bisher mit InfoPath noch nichts gemacht... Sind das XML Formulare? Wie willst du diese Formulare einsetzen/veröffentlichen? bzw. Wie stellst du dir die Usereingabe der IP Adresse vor?

Im Prinzip hat Bender schon eine nette Lösung geliefert die man noch ein bisschen Ausbauen könnte...
 
Warum prüft ihr eigentlich alle auf >0 ? Die 0 ist erlaubt, solange sie nicht die anführende Ziffer in einem Block mit 2 oder mehr Ziffern ist.

Wenn man nichts gegen die Performance regulärer Ausdrücke hat, kann mans auch mit folgendem Muster in einer Zeile lösen (auf oben erwähnten Fall wird nicht getestet, sonst werden alle Regeln beachtet):

Code:
^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})){3}$


Würde es ohne Regex lösen, aber damit wären innerhalb einer Zeile alle Fehlerquellen abgedeckt, keine negativen Zahlen, nur 4 Blöcke etc.


fnatichohn schrieb:
edit: Gut wärs auch wenn der Benutzer nur Zahlen eingeben muss und die Punkte automatisch gesetzt werden. Das Validieren ist aber vorrangig.

Geht nicht, oder woher soll dein Programm wissen, ob der User in einem Block 1, 11 oder 111 schreiben will?
 
Zuletzt bearbeitet:
carom schrieb:
Warum prüft ihr eigentlich alle auf >0 ? Die 0 ist erlaubt

Also in meinem Code steht:

Code:
			if(j < 0 || j > 255) {
				return false;
			}

Sprich, wenn die Zahl kleiner als 0 oder größer als 255 wird false zurückgegeben. Damit ist der Zahlenbereich von 0-255 erlaubt.
 
Firestorm- schrieb:
Geht schon, wenn das ganze über eine GUI blockweise realisiert wird!

Nein geht nicht, das von dir wäre eine Maske, kein automatisches setzen von Punkten. Okay ich gebe zu, der Satz "..Benutzer nur Zahlen eingeben muss und die Punkte automatisch gesetzt werden..." ist nicht ganz eindeutig. Wenn dort aber was von automatisch steht, dann klingt das nach einer Funktionalität als nach "statischen, toten Punkten".

Bender86 schrieb:
Also in meinem Code steht:


Den Code habe ich mir nicht direkt angeschaut, aber ja der stimmt. Ich kam nur darauf weil du geschrieben hast:

einzelnen Segmente zwischen 0 und 255 liegen

Diese Formulierung beschreibt den Zahlenbereich 1-254.
 
Zuletzt bearbeitet:
Naja das ist jetzt vielleicht ein bisschen Haarspalterei, aber im normalen Sprachgebrauch subtrahiert und addiert man ja normalerweise nicht 1 zur Ober- und Untergrenze von "zwischen". ;)

Wenn ich dir sage "Nenn mir eine Zahl zwischen 1 und 10", gehst du dann davon aus das ich 2-9 meine? :D
 
Naja, wenn's um Programmieren geht sollte man schon exakt formulieren...

Automatisch Punkte setzen wäre z.B. insofern machbar, dass wenn die erste Ziffer eines Blocks größer als 2 ist nur insgesamt 2 Ziffern möglich sind und ansonsten natürlich nach 3 Ziffern oder wenn der Punkt (oder z.B. Tab ö.ä.) gedrückt wird.
 
Zuletzt bearbeitet:
Firestorm- schrieb:
Mir gehts ähnlich wie Bender... Hab bisher mit InfoPath noch nichts gemacht... Sind das XML Formulare? Wie willst du diese Formulare einsetzen/veröffentlichen? bzw. Wie stellst du dir die Usereingabe der IP Adresse vor?

Im Prinzip hat Bender schon eine nette Lösung geliefert die man noch ein bisschen Ausbauen könnte...

XML Formulare sind das was der User nachher benutzt und ausfüllt. Also erstelle ich XSN Formularvorlagen. Wie ich das veröffentliche spielt ja keine Rolle. Es gibt ein Textfeld wo der User eine IP-Adresse eingeben muss. Dieses Feld soll eine Programmierung haben, die über die Vorlagen, die InfoPath mir so bietet, hinausgehen.


carom schrieb:
Geht nicht, oder woher soll dein Programm wissen, ob der User in einem Block 1, 11 oder 111 schreiben will?

Sorry, hatte mich da wohl wirklich etwas undeutlich ausgedrückt.

Ich will es so ähnlich wie hier haben:

IPValidator.JPG


Der User kann entweder "." drücken oder die Pfeiltaste nach rechts um zum nächsten Feld zu springen. (Hatte Backslash ja im Prinzip schon gesagt)

edit: Wenn jemand den Code aus diesem Projekt posten könnte wäre mir vielleicht auch schon sehr geholfen: http://www.freevbcode.com/ShowCode.asp?ID=3470
 
Zuletzt bearbeitet:
Zurück
Oben