Bookmarken Twitter Feed

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;
}
Bewertung: najagut
Loading ... Loading ...

Ähnliche Beiträge



6 Kommentare zu Ip Regular Expression Check

Avatar

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

Avatar

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.

Avatar

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

Avatar

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 ;)

Avatar

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

Avatar

naden

17. Oktober 2009 um 19:58:18

@panne, absolut richtig, ich habe es verbessert.

Schreib einen Kommentar

Fülle das Kommentar-Formular vollständig aus oder melde dich über Twitter oder Facebook an.
Sign in with Facebook

By Teledir Internetanbieter