3 года назад выкладывал тут проверку ОГРН на JS, вот теперь понадобилась такая же на PHP. Так что выложу и её.
Но в случае с PHP стоит учитывать один нюанс: проверка будет работать корректно только если будет запущена на 64х-разрядной версии PHP. Почему эта же проверка на JS работает в 32х-разрядных браузерах я сказать не берусь. Не иначе как магия.
Собственно код:
function checkOGRN($ogrn){
if(!is_numeric($ogrn)){
echo 'ОГРН должен состоять из цифр';
return false;
}
if($ogrn > PHP_INT_MAX){
echo 'Проверка невозможна, т.к. скрипт запущен
на 32х-разрядной версии PHP';
return false;
}
//делаем строкой
$ogrn = $ogrn.'';
if(strlen($ogrn) == 13 and $ogrn[12] != substr((substr($ogrn, 0, -1)%11), -1)
){
echo 'Контрольное число равно '.substr((substr($ogrn,
0, -1)%11), -1).'. Ожидалось '.$ogrn[12];
return false;
}elseif(strlen($ogrn) == 15 and $ogrn[14] != substr(substr($ogrn, 0, -1)%13,
-1)){
echo 'Контрольное число равно '.substr(substr($ogrn,
0, -1)%13, -1).'. Ожидалось '.$ogrn[14];
return false;
}elseif(strlen($ogrn) != 13 and strlen($ogrn) != 15){
echo 'ОГРН должен состоять из 13 или 15 цифр';
return false;
}
return true;
}
P.S. выкладываю для ленивых. Вдруг кто хочет что-то готовое и не хочет разбираться.
// Проверка ОГРН для 32-х битного PHP
function checkOGRN($ogrn){
if(!preg_match(«[0-9]»,$ogrn)){
echo ‘ОГРН должен состоять из цифр’;
return false;
}
$ogrn = $ogrn.»;
if(strlen($ogrn) == 13 and $ogrn[12] != $ost= substr(bcsub(substr($ogrn, 0, -1),bcmul(bcdiv(substr($ogrn, 0, -1),’11’),’11’)),-1))
{
echo ‘Контрольное число равно ‘.substr((substr($ogrn,
0, -1)%11), -1).’. Ожидалось ‘.$ogrn[12];
return false;
}
elseif(strlen($ogrn) == 15 and $ogrn[14] != substr(bcsub(substr($ogrn, 0, -1),bcmul(bcdiv(substr($ogrn, 0, -1),’13’),’13’)),-1))
{
echo ‘Контрольное число равно ‘.substr(substr($ogrn,
0, -1)%13, -1).’. Ожидалось ‘.$ogrn[14];
return false;
}elseif(strlen($ogrn) != 13 and strlen($ogrn) != 15){
echo ‘ОГРН должен состоять из 13 или 15 цифр’;
return false;
}
return true;
}
Ответить