Walidacja numerów PESEL, NIP, REGON w Javascript i PHP

Ulepszone funkcje z tego wpisu. Aktualnie funkcje sprawdzają także sumy kontrolne zawarte w tych numerach, na podstawie Wikipedii. Wystarczy przeanalizować kody

Odmiany funkcji w Javascript i PHP są w pełni zgodne, to znaczy że dadzą taką samą odpowiedź.

Aktualizacja 2017-05-02:

  • Zamieniłem polskie nazwy zmiennych na angielskie;
  • Funkcje od PESEL sprawdzają czy data jest poprawna, tj. miesiąc nie większy niż 12 i dzień miesiąca nie większy niż 31. To rozwiązuje problemy opisane w komentarzach. Dziękuję za zwrócenie uwagi i dziękuję Panu Krzysztofowi Grabania za propozycję rozwiązania problemu.
  • Poprawione wcięcia itp.
  • Dodane formularze, gdzie można sobie potestować jak działają funkcje w wersji JS. Wersje PHP: http://test.vt0.pl/v/

Oczywiście jeśli użytkownik będzie chciał, to i tak da radę wprowadzić nieprawdziwe dane, ale dzięki tej walidacji uchronimy się przed omyłkowym wpisaniem danych z błędami w formularzu.

1. Walidacja PESEL:

Kod PHP:

function validatepesel($pesel) {
    $reg = '/^[0-9]{11}$/';
    if(preg_match($reg, $pesel)==false)
        return false;
    else
    {
        $digits = str_split($pesel);
        if ((intval(substr($pesel, 4, 2)) > 31)||(intval(substr($pesel, 2, 2)) > 12))
            return false;
        $checksum = (1*intval($digits[0]) + 3*intval($digits[1]) + 7*intval($digits[2]) + 9*intval($digits[3]) + 1*intval($digits[4]) + 3*intval($digits[5]) + 7*intval($digits[6]) + 9*intval($digits[7]) + 1*intval($digits[8]) + 3*intval($digits[9]))%10;
        if($checksum == 0) 
            $checksum = 10;
        $checksum = 10 - $checksum;
            
        return (intval($digits[10]) == $checksum);
    }
}

Kod Javascript:

function validatepesel(pesel) {
    var reg = /^[0-9]{11}$/;
    if(reg.test(pesel) == false) 
        return false;
    else
    {
        var digits = (""+pesel).split("");
        if ((parseInt(pesel.substring( 4, 6)) > 31)||(parseInt(pesel.substring( 2, 4)) > 12))
            return false;
        
        var checksum = (1*parseInt(digits[0]) + 3*parseInt(digits[1]) + 7*parseInt(digits[2]) + 9*parseInt(digits[3]) + 1*parseInt(digits[4]) + 3*parseInt(digits[5]) + 7*parseInt(digits[6]) + 9*parseInt(digits[7]) + 1*parseInt(digits[8]) + 3*parseInt(digits[9]))%10;
        if(checksum==0) checksum = 10;
            checksum = 10 - checksum;

        return (parseInt(digits[10])==checksum);
    }
}

Test:

READY

2.Walidacja NIP

Kod PHP:

function validatenip($nip) {
    $nipWithoutDashes = preg_replace("/-/","",$nip);
    $reg = '/^[0-9]{10}$/';
    if(preg_match($reg, $nipWithoutDashes)==false)
        return false;
    else
    {
        $digits = str_split($nipWithoutDashes);
        $checksum = (6*intval($digits[0]) + 5*intval($digits[1]) + 7*intval($digits[2]) + 2*intval($digits[3]) + 3*intval($digits[4]) + 4*intval($digits[5]) + 5*intval($digits[6]) + 6*intval($digits[7]) + 7*intval($digits[8]))%11;

        return (intval($digits[9]) == $checksum);
    }
}

Kod Javascript:

function validatenip(nip) {
    var nipWithoutDashes = nip.replace(/-/g,"");
    var reg = /^[0-9]{10}$/;
    if(reg.test(nipWithoutDashes) == false) {
        return false;}
    else
    {
        var digits = (""+nipWithoutDashes).split("");
        var checksum = (6*parseInt(digits[0]) + 5*parseInt(digits[1]) + 7*parseInt(digits[2]) + 2*parseInt(digits[3]) + 3*parseInt(digits[4]) + 4*parseInt(digits[5]) + 5*parseInt(digits[6]) + 6*parseInt(digits[7]) + 7*parseInt(digits[8]))%11;
        
        return (parseInt(digits[9])==checksum);
    }
}

Test:

READY

3. Walidacja REGON (9-cyfrowy):

Kod PHP:

function validateregon9($regon) {
    $reg = '/^[0-9]{9}$/';
    if(preg_match($reg, $regon)==false)
        return false;
    else
    {
        $digits = str_split($regon);
        $checksum = (8*intval($digits[0]) + 9*intval($digits[1]) + 2*intval($digits[2]) + 3*intval($digits[3]) + 4*intval($digits[4]) + 5*intval($digits[5]) + 6*intval($digits[6]) + 7*intval($digits[7]))%11;
        if($checksum == 10) 
            $checksum = 0;

        return (intval($digits[8]) == $checksum);
    }
}

Kod Javascript:

function validateregon9(regon) {
    var reg = /^[0-9]{9}$/;
    if(!reg.test(regon)) 
        return false;
    else
    {
        var digits = (""+regon).split("");
        var checksum = (8*parseInt(digits[0]) + 9*parseInt(digits[1]) + 2*parseInt(digits[2]) + 3*parseInt(digits[3]) + 4*parseInt(digits[4]) + 5*parseInt(digits[5]) + 6*parseInt(digits[6]) + 7*parseInt(digits[7]))%11;
        if(checksum == 10) 
            checksum = 0;
        
        return (parseInt(digits[8])==checksum);
    }
}

Test:

READY

Kontynuuj czytanie » || Napisał dnia: 06.03.14. || ||

Komentarze:

  1. Aleksander Kawęczyński – strona prywatna » Walidacja adresu email, numeru pesel, numeru telefonu w Javascript i PHP Napisał/a:

    […] UWAGA! Przygotowałem ulepszone funkcje, które dostępne są tutaj. […]

    06.03.14 || o godzinie 21:10
  2. intuigo.pl Napisał/a:

    thx,
    przydatne,
    polecam walidację zawsze po stronie serwera,
    jak już musi być w js to w 2 miejscach,
    bo zawsze się jakiś „spryciarz” może znaleźć wysyłający spreparowane posty.
    pozdr
    MK

    17.07.14 || o godzinie 14:47
  3. Rob Napisał/a:

    Przydały się w projekcie – dzięki! Pytanie tylko czemu nazwy zmiennych po polsku? 🙂 Po tym jak raz musiałem analizować kod od francuza zwracam na to uwagę.

    05.01.15 || o godzinie 12:16
  4. Matt Napisał/a:

    Też bym się przyczepił do nazw zmiennych i odrobinę do czystości kodu. Ale poza tym spoko 🙂
    Dzięki!

    05.05.15 || o godzinie 16:11
  5. Manio Napisał/a:

    Walidacja pesel nie działa dla ‚82018228861’

    16.10.15 || o godzinie 10:33
  6. Alekander Kawęczyński Napisał/a:

    Z funkcji dla którego języka Pan korzysta? Właśnie przetestowałem obie wersje z podanym numerem PESEL i działają poprawnie (zwracają true).

    Uruchomiony przykład dla javascript: http://jsfiddle.net/olelek/nemnechu/

    16.10.15 || o godzinie 12:40
  7. Manio Napisał/a:

    Walidacja na pesel w Javascript. Pesel „82018228861” jest niepoprawny, jest niepoprawna data w peselu, dlatego funkcja powinna zwrócić false.

    16.10.15 || o godzinie 13:31
  8. Krzysztof Grabania Napisał/a:

    PESEL ma wadę – można zamienić rok z dniem i walidacja przejdzie (via Wikipedia). Jednym z najprostszych sposób na naprawienie tego jest sprawdzenie cyfr 5 i 6 (w powyższym przykładzie będzie to 82) czy nie są przypadkiem większe od 31. W kodzie PHP tak to wygląda (należy umieścić w 7 linii):
    if (intval(substr($pesel, 4, 2)) > 31)
    return false;

    05.11.15 || o godzinie 11:49
  9. Maciek N Napisał/a:

    Hej, tu znalazłem fajny generator PESEL: http://generatory.it/ Gdyby ktoś chciał testować.

    01.03.16 || o godzinie 11:05
  10. lordkm Napisał/a:

    Próbuję zastosować skrypt do walidacji nip w Adobe Acrobat. Tworzę interaktywny formularz. Za każdym razem kiedy wpisuję błędny nip nic się nie dzieje. w polu mogę wpisać nawet słowa. Co zrobić żeby skrypt zaczął działać poprawnie?

    function validatenip(nip) {
    var nip_bez_kresek = nip.replace(/-/g,””);
    var reg = /^[0-9]{10}$/;
    if(reg.test(nip_bez_kresek) == false) {
    return false;}
    else
    {
    var dig = („” nip_bez_kresek).split(„”);
    var kontrola = (6*parseInt(dig[0]) 5*parseInt(dig[1]) 7*parseInt(dig[2]) 2*parseInt(dig[3]) 3*parseInt(dig[4]) 4*parseInt(dig[5]) 5*parseInt(dig[6]) 6*parseInt(dig[7]) 7*parseInt(dig[8]));
    if(parseInt(dig[9])==kontrola)
    return true;
    else
    return false;
    }

    }

    09.03.16 || o godzinie 13:02
  11. premax Napisał/a:

    Walidator NIP przepuszcza NIP o wartości 0000000000.

    05.04.16 || o godzinie 22:33
  12. Uland Napisał/a:

    Validacja PESEL w JS wykłada się na 22222222222, 44444444444, 88888888888 itd.

    23.11.16 || o godzinie 16:37
  13. piop Napisał/a:

    Chciałbym zwrócić uwagę, ze walidacja PESEL jest bledna – otóż dla osób urodzonych po 2000 roku pesel wygląda nieco inaczej ( 20 do miesiąca). Mysle, ze należy o tym pamiętać i uwzględnić, ponieważ mamy juz 17 roczników takich osób.
    Warunek month<12 jest niespelniony.
    Pozdrawiam!

    10.05.17 || o godzinie 23:43
  14. Mardok Napisał/a:

    Tak bay mieć spokój przynajmniej do 2090r.

    JS
    if ((intval(substr($pesel, 4, 2)) > 31)||(intval(substr($pesel, 2, 2)) > 32)||((intval(substr($pesel, 2, 2)) > 12) && (intval(substr($pesel, 2, 2)) 31)||(intval(substr($pesel, 2, 2)) > 32)||((intval(substr($pesel, 2, 2)) > 12) && (intval(substr($pesel, 2, 2)) < 20)))

    15.08.17 || o godzinie 07:35
  15. Jacek Napisał/a:

    A jakby iść dalej i pobierać z API NIP/Regonu dane do pól formularza Javascript/PHP
    —————————————————–

    Interfejsy API:

    http://bip.stat.gov.pl/dzialalnosc-statystyki-publicznej/rejestr-regon/interfejsyapi/

    04.11.17 || o godzinie 17:56
  16. Jacek Napisał/a:

    jakieś problemy w komentarzach 🙁

    04.11.17 || o godzinie 17:57
  17. Maciek Napisał/a:

    Niestety, walidacja pesel nie działa dla roczników > 2000 roku,
    np:
    01280516784

    03.04.18 || o godzinie 14:32
  18. Romek Napisał/a:

    Jak widzę w kodzie programu, który jest interpretowany a nie kompilowany to się zawsze zastanawiam czy autor zaczynał swoją edukację programistyczną od VB-basicu.

    checksum = (1*parseInt(digits[0]) 3*parseInt(digits[1]) 7*parseInt(digits[2]) 9*parseInt(digits[3]) 1*parseInt(digits[4]) 3*parseInt(digits[5]) 7*parseInt(digits[6]) 9*parseInt(digits[7]) 1*parseInt(digits[8]) 3*parseInt(digits[9]));

    To można napisać dwa razy krócej gdy się obejrzy podręcznik javaskryptu. To samo dotyczy kodu w PHP.

    22.07.18 || o godzinie 14:33
  19. Romek Napisał/a:

    Formularz kontaktowy źle działa. Jak wpisałem kawałek kodu w javascript to mi wywalił takie ostrzeżenia:

    Warning: Creating default object from empty value in /home/virtmedia/domains/kaweczynski.pl/public_html/blog.aleksander/wp-content/plugins/ajax-comments/ajax-comments.php on line 203

    Warning: Cannot modify header information – headers already sent by (output started at /home/virtmedia/domains/kaweczynski.pl/public_html/blog.aleksander/wp-content/plugins/ajax-comments/ajax-comments.php:203) in /home/virtmedia/domains/kaweczynski.pl/public_html/blog.aleksander/wp-content/plugins/ajax-comments/ajax-comments.php on line 206

    22.07.18 || o godzinie 14:36
  20. krokodyl Napisał/a:

    jak traktowac pesel: 00000000000 wedlug validatora jest prawidlowy

    30.08.18 || o godzinie 16:22
  21. muaddib Napisał/a:

    Pesel w JS niie puszcza poprawnych peseli dla ludzi urodzonych po 2000?

    Np 18231030903

    01.10.18 || o godzinie 13:54
  22. 23.10.2018 – Witryny – AdminNote Napisał/a:

    […] Walidacja numerów PESEL, NIP, REGON w Javascript i PHP […]

    24.10.18 || o godzinie 11:32
  23. Tester Napisał/a:

    ale dziurawy ten walidator.
    Przykładowo numer 96023112349 zwraca jako true, mimo iż pesel jest niepoprawny (w 95 roku nie było 29 dni w lutym).
    Ten warunek też powinien być sprawdzany i uwzględniany.

    26.01.19 || o godzinie 20:59
  24. michal Napisał/a:

    bardzo slaby walidator. nie waliduje pesela np: 10300177799

    19.06.19 || o godzinie 18:17
  25. edytao Napisał/a:

    PESEL po 2000 roku nie przejdzie walidacji ponieważ

    miesiąc = miesiąc 20
    czyli dla daty urodzenia 2019.07.01 to będzie 192701XXXXX

    dziwię się, że tego nie wiecie.
    Wzięło się to stąd że wciąż żyją ludzie który urodzili się na początku XX wieku a rok w PESELu ma tylko dwa znaki więc mogły by się dublować i nie wiadomo by było czy to starzec czy dziecko.
    Żeby nie zmieniać systemu, nie dodawać cyfr rząd poszedł prostą drogą i dodał 20 do miesiąca. Za sto lat można w ten sposób dodać kolejne 20 i wciąż system będzie działał a PESEL będzie unikalny. Takiej numeracji starczy na 500 lat.

    24.07.19 || o godzinie 11:29

Skomentuj: Walidacja numerów PESEL, NIP, REGON w Javascript i PHP