IP-adres valideren met regex: patroon voor IPv4 en IPv6

Het fragment hieronder is een reguliere expressie om IP-adressen te valideren, zowel IPv4 als IPv6. Hij werkt hetzelfde in JavaScript, in PHP en in HTML, met kant-en-klare functies om te controleren of een adres een geldig formaat heeft.

IP-adres valideren met regex: patroon voor IPv4 en IPv6

Het fragment hieronder is een reguliere expressie die IP-adressen valideert. Hij werkt in JavaScript net zo goed als in PHP of in HTML, en er horen een paar handige functies bij die ermee controleren of een IP-adres een geldig formaat heeft.

Reguliere expressie voor 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}

Reguliere expressie voor 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-versie

Het formaat hangt af van de versie: een IPv4-adres ziet er zo uit: 0.0.0.0.

Een IPv6-adres zo: 2001:0db8:3c4d:0015:0000:d234::3eee:0000

De functie krijgt een IP-adres als string binnen en vergelijkt dat met de reguliere expressie. Klopt het formaat niet, dan geeft ze false terug, klopt het wel, dan geeft ze true terug.

regex ip-adres javascript

javascript
/**
 * Een IP valideren met een reguliere expressie
 *
 * Als het IP ongeldig is, geef false terug, anders IPv4 of IPv6
 *
 * @param ip
 * @return Boolean
 */
function validateIP(ip){

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

return false;
}

/**
 * Een IPv4 valideren met een reguliere expressie
 *
 * Als het IP ongeldig is, geef false terug
 *
 * @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);
}

/**
 * Een IPv6 valideren met een reguliere expressie
 *
 * Als het IP ongeldig is, geef false terug
 *
 * @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);
}

De regex in JavaScript gebruiken

De eenvoudigste manier om deze reguliere expressie in te zetten is in een IF-voorwaarde, zoals hieronder.

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-versie

Om in PHP aan een IP-adres te komen, vertrouw je op$_SERVER[‘REMOTE_ADDR’] , dat het echte adres van de verbindende partij bevat. Betrouwbaarder wordt het niet.

Die partij kan echter achter een proxy zitten. Dan heeft de proxy mogelijk $_SERVER[‘HTTP_X_FORWARDED_FOR’] gezet, een waarde die zich makkelijk laat vervalsen. Ze kan net zo goed van iemand zonder proxy komen, of het adres erin is een intern LAN-adres achter de proxy.

Log je $_SERVER[‘HTTP_X_FORWARDED_FOR’], log dan dus ook $_SERVER[‘REMOTE_ADDR’], bijvoorbeeld in twee aparte kolommen van je database.

En sla je een IP-adres als string op, reserveer dan minstens 45 tekens. IPv6 gaat niet meer weg, en die adressen zijn langer dan de oude IPv4-adressen.

Let op

Bedenk goed wat je doet als je een IP-adres in een database opslaat: je applicatie moet daarbij AVG-conform blijven.

regex ip-adres php

php
/**
 * Een IP valideren met een reguliere expressie
 *
 * Als het IP ongeldig is, geef false terug, anders IPv4 of IPv6
 *
 * @param $ip
 * @return Boolean
 */
function validateIP($ip){

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

return false;
}

/*
 * Valideert 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);
}

/*
 * Valideert 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;
    // Mijn IP is een IPv4
} else {
    echo "IP Invalide !";
}

HTML-versie

Je kunt een veld ook direct in de markup laten controleren, via het attribuut pattern van <input>. Let op: daarmee maak je de bezoeker alleen zichtbaar dat er iets niet klopt, bijvoorbeeld met een rode rand. Als validatie telt het niet.

regex ip-adres 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 Webdeveloper sinds 2010, maker van Gekkode en Email Impact. Elk artikel wordt vóór publicatie getest op een echt project. Contact
Nieuwsbrief

Nieuwe tests, tutorials en projecten, per e-mail.

Reproduceerbare tests, geversioneerde code, gedateerde resultaten. Nooit spam.