Um eine IP-Adresse im Dot Quoted-Format auf Richtigkeit zu überprüfen tut es ein regulärer Ausdruck alleine nicht, da man mit regulären Ausdrücken leider keine “größer kleiner” Tests durchführen kann.
Die Funktion isIp()prüft zuerst, ob die IP aus vier, durch einen Punkt getrennten Blöcken aus 1 bis 3-stelligen Zahlen besteht.
Im nächsten Schritt wird noch abgesichert, dass die gefundenen Zahlen kleiner gleich 255 sind. Ein Zahlenblock einer IP v4 Adresse muß zwischen 0 und 255 liegen.
Ein Test auf “größer gleich” 0 entfällt, da schon der reguläre Ausdruck keine negativen Zahlen erlaubt.
function isIp($s) { if(ereg('^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$', $s, $tokens)) { if($tokens[1] <= 255 && $tokens[2] <= 255 && $tokens[3] <= 255 && $tokens[4] <= 255) { return true; } } return false; } |
Aber sicher doch ist es möglich mit RegEx eine IP zu prüfen:
z.B. so
^([0-9]{1,2}|[1-2][0-9]{2})\.([0-9]{1,2}|[1-2][0-9]{2})\.([0-9]{1,2}|[1-2][0-9]{2})\.([0-9]{1,2}|[1-2][0-9]{2})$
oder auch so:
^[12]?[0-9]?[0-9](\.[12]?[0-9]?[0-9]){3}$
Wenn man sich ernsthaft mit RegEx beschäftigen möchte und deren Potential ausreizen will, empfehle ich die Lektüre: “Reguläre Ausdrücke” vom O’Reilly Verlag
http://www.oreilly.de/catalog/regex3ger/index.html
Grüße
Dirk Osburg
Gute Lösung! Wenn man komplexe reguläre Ausdrücke nicht aus dem FF zaubern kann, dann ist ein anderer Ansatz oft schneller realisiert.
Danke!
Es hat sich allerdings ein Fehler eingeschlichen. In meiner Lösung gab es immer noch keine “Prüfung” auf IP-Blöcke, welche einen Wert über 255 aufweisen.
So wäre es korrekt:
^((25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})$
Allerdings stimme ich dir hier auch zu, dass diese Lösung nicht trivial ist. Regläre Ausdrücke eignen sich für Wertebereichprüfungen halt nicht sonderlich.
Btw. noch einen Tipp. Die Zeile:
——————————
ereg( ‘^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$’, $s, $tokens )
——————————
würde ich durch folgende ersetzen:
——————————
$tokens = split(“\.”,$s,4)
——————————
oder besser ganz auf die langsameren RegEx verzichten:
——————————
$tokens = explode(‘.’,$s,4)
——————————
Anschließend kann man weiterhin die Teilausdrücke auf einen korrekten Wertebereich prüfen.
Grüße
Dirk Osburg
Danke für den Nachschlag. Klar kann man das ohne reguläre Ausdrücke durch ein explode und größer-kleiner-Vergleiche lösen. Das war hier aber nicht die Aufgabe ;)
Hi,
bist du sicher, das du dort $tokens[0] bis $tokens[3] auf kleiner/gleich 255 vergleichen wolltest?
In $tokens[0] sollte doch wohl die gesamte IP-Adresse stehen, die einzelnen Klammerausdrücke müssten sich doch auf $tokens[1] – $tokens[4] verteilen, oder seh ich da was falsch?
Gruß, panne
@panne, absolut richtig, ich habe es verbessert.