Wyrażenie regularne do walidacji adresu IP: IPv4 i IPv6

Wyrażenie regularne do walidacji adresu IP: IPv4 i IPv6

Poniższy snippet to wyrażenie regularne, które sprawdza poprawność adresów IP. Działa tak samo w JavaScripcie, w PHP i w HTML, a na jego bazie przygotowałem kilka wygodnych funkcji sprawdzających, czy adres IP ma poprawny format.

Wyrażenie regularne regex 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}

Wyrażenie regularne regex 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]))

Wersja JavaScript

Format zależy od wersji protokołu: adres IPv4 wygląda tak 0.0.0.0.

Adres IPv6 wygląda tak: 2001:0db8:3c4d:0015:0000:d234::3eee:0000

Funkcja przyjmuje adres IP jako ciąg znaków i porównuje go z wyrażeniem regularnym. Jeśli ciąg nie pasuje do formatu, funkcja zwraca false, jeśli pasuje, zwraca true.

wyrażenie regularne adres ip javascript

javascript
/**
 * Walidacja adresu IP wyrażeniem regularnym
 *
 * Jeśli adres IP jest nieprawidłowy, zwraca false, w przeciwnym razie IPv4 albo IPv6
 *
 * @param ip
 * @return Boolean
 */
function validateIP(ip){

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

return false;
}

/**
 * Walidacja adresu IPv4 wyrażeniem regularnym
 *
 * Jeśli adres IP jest nieprawidłowy, zwraca false
 *
 * @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);
}

/**
 * Walidacja adresu IPv6 wyrażeniem regularnym
 *
 * Jeśli adres IP jest nieprawidłowy, zwraca false
 *
 * @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);
}

Użycie wyrażenia w JavaScripcie

Najprościej wykorzystać to wyrażenie wewnątrz warunku IF, tak jak poniżej.

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

Wersja PHP

Żeby odczytać adres IP w PHP, oprzyj się na$_SERVER[’REMOTE_ADDR’] , które zawiera rzeczywisty adres łączącej się strony. To najbardziej wiarygodna wartość, jaką dostaniesz.

Klient może jednak siedzieć za serwerem proxy, wtedy proxy ustawia $_SERVER[’HTTP_X_FORWARDED_FOR’], tyle że tę wartość bardzo łatwo podrobić. Może ją ustawić ktoś, kto w ogóle nie korzysta z proxy, albo może się w niej znaleźć wewnętrzny adres LAN sprzed proxy.

Dlatego jeśli zapisujesz $_SERVER[’HTTP_X_FORWARDED_FOR’], zapisuj obok również $_SERVER[’REMOTE_ADDR’], na przykład w dwóch osobnych kolumnach bazy danych.

A jeśli trzymasz adres IP w bazie jako ciąg znaków, zarezerwuj co najmniej 45 znaków. IPv6 zostaje z nami na dobre, a te adresy są dłuższe niż dawne IPv4.

Uwaga

Zastanów się dwa razy, zanim zapiszesz adres IP w bazie danych: twoja aplikacja musi pozostać zgodna z RODO.

wyrażenie regularne adres ip php

php
/**
 * Walidacja adresu IP wyrażeniem regularnym
 *
 * Jeśli adres IP jest nieprawidłowy, zwraca false, w przeciwnym razie IPv4 albo IPv6
 *
 * @param $ip
 * @return Boolean
 */
function validateIP($ip){

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

return false;
}

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

/*
 * Walidacja 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;
    // Moje IP to IPv4
} else {
    echo "IP Invalide !";
}

Wersja HTML

Pole formularza możesz sprawdzić także po stronie znaczników, atrybutem pattern elementu <input>. Pamiętaj tylko, że służy to wyłącznie do pokazania użytkownikowi, że coś wpisał źle, na przykład czerwoną ramką. Na takiej walidacji nie wolno polegać.

wyrażenie regularne adres ip 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 Web developer od 2010 roku, twórca Gekkode i Email Impact. Każdy artykuł jest sprawdzany na prawdziwym projekcie przed publikacją. Kontakt
Newsletter

Nowe testy, poradniki i projekty — e-mailem.

Powtarzalne testy, wersjonowany kod, datowane wyniki. Nigdy spamu.