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