RSS Feed

Ip Regular Expression Check

11.04.2009 by naden

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 »

  1. Dirk Osburg sagt:

    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

  2. naden sagt:

    Gute Lösung! Wenn man komplexe reguläre Ausdrücke nicht aus dem FF zaubern kann, dann ist ein anderer Ansatz oft schneller realisiert.

  3. Dirk Osburg sagt:

    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

  4. naden sagt:

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

  5. panne sagt:

    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

  6. naden sagt:

    @panne, absolut richtig, ich habe es verbessert.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>