Skrypt sprawdzający poprawność numeru PESEL, wyciąga również datę urodzenia oraz płeć. Miejsce na wpisanie numeru zaznaczono na czerwono.
Funkcja sprawdza poprawnie w zakresie od 1800 do 2300 roku.
Listing:
<?php
function CheckPesel($pesel, &$date, &$sex)
{
$weights = array(1,3,7,9,1,3,7,9,1,3);
$Sum = 0;
for($i = 0; $i < 10; $i++)
{
$sum += $pesel[$i] * $weights[$i];
}
$sum = $sum % 10;
$checkSum = (10 - $sum) % 10;
if ($pesel[10] <> $checkSum) return false;
else
{
if ($pesel[9] % 2 == 0)
$sex = 'K' ;
else
$sex = 'M';
$yearEndStr = substr($pesel, 0, 2);
$monthStr= substr($pesel, 2, 2);
$dayStr = substr($pesel, 4,2);
$day = intval($dayStr);
$month = intval($monthStr);
if ($day > 31) return false;
else
{
$yearStartStr = '19';
if ($month >= 80)
{
$yearStartStr = '18';
$month = $month - 80;
}
else
if ($month >= 60)
{
$yearStartStr = '22';
$month = $month - 60;
}
else
if ($month >= 40)
{
$yearStartStr = '21';
$month = $month - 40;
}
else
if($month >= 20)
{
$yearStartStr = '20';
$month = $month - 20;
}
}
$yearStr = $yearStartStr.$yearEndStr;
$year = intval($yearStr);
if (($month < 1) or ($month > 12))
return false;
else
{
if ($month == 2)
{
if ($day > 29) return false;
else
if (($day == 29) and (($year % 4) <> 0) or ($yearEnd == '00')) return false;
}
else
if (($day == 31) and (($month == 4) or ($month == 6) or ($month == 9) or ($month == 11)))
return false;
}
}
$monthStr = $month;
if (strlen($monthStr) < 2)
$monthStr = '0'.$monthStr;
$date = $yearStr.'-'.$monthStr.'-'.$dayStr;
return true;
}
// wywołanie
// nr pesel
$pesel = 'tutaj wpisz numer pesel';
if(CheckPesel($pesel, $date, $sex))
{
echo $date.'<br>'; // data urodzenia
echo $sex; // płeć
}
else
{
echo'niepoprawny nr pesel';
}
?>