IP-Adresse mit Regex validieren: Muster für IPv4 und IPv6

IP-Adresse mit Regex validieren: Muster für IPv4 und IPv6

Das folgende Snippet ist ein regulärer Ausdruck, der IP-Adressen validiert. Er funktioniert in JavaScript genauso wie in PHP oder HTML, dazu kommen ein paar praktische Funktionen, die damit prüfen, ob eine IP-Adresse ein gültiges Format hat.

Regulärer Ausdruck für IPv4

php
(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}

Regulärer Ausdruck für IPv6

php
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

JavaScript-Version

Das Format hängt von der Version ab: Eine IPv4-Adresse sieht so aus: 0.0.0.0.

Eine IPv6-Adresse so: 2001:0db8:3c4d:0015:0000:d234::3eee:0000

Die Funktion nimmt eine IP-Adresse als Zeichenkette entgegen und vergleicht sie mit dem regulären Ausdruck. Passt das Format nicht, gibt sie false zurück, passt es, gibt sie true zurück.

regex ip adresse javascript

javascript
/**
 * Eine IP mit einem regulären Ausdruck validieren
 *
 * Wenn die IP ungültig ist, false zurückgeben, sonst IPv4 oder IPv6
 *
 * @param ip
 * @return Boolean
 */
function validateIP(ip){

if(isIPv4(ip)) {
        return 'IPv4';
    } elseif (isIPv6(ip)) {
        return 'IPv6';
    }

return false;
}

/**
 * Eine IPv4 mit einem regulären Ausdruck validieren
 *
 * Wenn die IP ungültig ist, false zurückgeben
 *
 * @param ip
 * @return Boolean
 */
function isIPv4(ip){
    var Reg = new RegExp(/^(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/i);
    return Reg.test(ip);
}

/**
 * Eine IPv6 mit einem regulären Ausdruck validieren
 *
 * Wenn die IP ungültig ist, false zurückgeben
 *
 * @param ip
 * @return Boolean
 */
function isIPv6(ip){
    var Reg = new RegExp(/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/i);
    return Reg.test(ip);
}

Regex in JavaScript einsetzen

Am einfachsten nutzt du den regulären Ausdruck in einer IF-Bedingung, wie unten.

javascript
let ip;
if(ip = validateIP('192.168.0.1')){
  alert(ip + "valide");
} else {
  alert("Adresse IP Invalide");
}

if(ip = validateIP('2001:0db8:3c4d:0015:0000:d234::3eee:0000')){
  alert(ip + "valide");
} else {
  alert("Adresse IP Invalide");
}

See the Pen
Valider une adresse IP avec une expression régulière
by Damien Flandrin (@dam62500)
on CodePen.0

PHP-Version

Um in PHP an eine IP-Adresse zu kommen, verlässt du dich auf$_SERVER[‚REMOTE_ADDR‘] , das die tatsächliche Adresse der Gegenstelle enthält. Zuverlässiger wird es nicht.

Die Gegenstelle kann allerdings hinter einem Proxy sitzen. Dann hat der Proxy womöglich $_SERVER[‚HTTP_X_FORWARDED_FOR‘] gesetzt, einen Wert, der sich leicht fälschen lässt. Er kann auch von jemandem ganz ohne Proxy stammen, oder die Adresse darin ist eine interne LAN-Adresse hinter dem Proxy.

Wenn du $_SERVER[‚HTTP_X_FORWARDED_FOR‘] protokollierst, protokolliere deshalb auch $_SERVER[‚REMOTE_ADDR‘], zum Beispiel in zwei getrennten Spalten deiner Datenbank.

Und wenn du eine IP-Adresse als Zeichenkette speicherst, sieh mindestens 45 Zeichen vor. IPv6 bleibt uns erhalten, und diese Adressen sind länger als die alten IPv4-Adressen.

Achtung

Überleg dir gut, was du tust, wenn du eine IP-Adresse in einer Datenbank speicherst: Deine Anwendung muss dabei DSGVO-konform bleiben.

regex ip adresse php

php
/**
 * Eine IP mit einem regulären Ausdruck validieren
 *
 * Wenn die IP ungültig ist, false zurückgeben, sonst IPv4 oder IPv6
 *
 * @param $ip
 * @return Boolean
 */
function validateIP($ip){

if(isIPv4($ip)) {
        return 'IPv4';
    } elseif (isIPv6($ip)) {
        return 'IPv6';
    }

return false;
}

/*
 * Validiert IPv4
 * @param $ip
 */
 function isIPv4($ip)
 {
    return preg_match('/^(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/i', $ip);
}

/*
 * Validiert IPv6
 * @param $ip
 */
 function isIPv6($ip)
 {
    return preg_match('/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/i', $ip);
 }
php
if ($ip = validateIP($_SERVER['REMOTE_ADDR']) {
    echo "Mon IP est une " . $ip;
    // Meine IP ist eine IPv4
} else {
    echo "IP Invalide !";
}

HTML-Version

Du kannst ein Feld auch direkt im Markup prüfen lassen, über das Attribut pattern von <input>. Beachte: Das macht dem Besucher nur sichtbar, dass etwas nicht stimmt, etwa mit einem roten Rahmen. Als Validierung taugt es nicht.

regex ip adresse html

html
<input
      name="ip"
      type="text"
      pattern="(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}"
      placeholder="#.#.#.#"
     />

See the Pen
Untitled
by Damien Flandrin (@dam62500)
on CodePen.0

HTMLJavaScriptPHP

Damien Flandrin Webentwickler seit 2010, Gründer von Gekkode und Email Impact. Jeder Artikel wird vor der Veröffentlichung an einem echten Projekt getestet. Kontakt
Newsletter

Neue Tests, Tutorials und Projekte, per E-Mail.

Reproduzierbare Tests, versionierter Code, datierte Ergebnisse. Niemals Spam.