Ip Regular Expression Check
11. April 2009 | In: Php
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; } |

6 Kommentare zu Ip Regular Expression Check
Dirk Osburg
19. April 2009 um 09:43:05
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
naden
19. April 2009 um 21:00:27
Gute Lösung! Wenn man komplexe reguläre Ausdrücke nicht aus dem FF zaubern kann, dann ist ein anderer Ansatz oft schneller realisiert.
Dirk Osburg
20. April 2009 um 20:08:47
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
naden
21. April 2009 um 11:03:54
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 ;)
panne
16. Oktober 2009 um 19:12:04
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
naden
17. Oktober 2009 um 19:58:18
@panne, absolut richtig, ich habe es verbessert.