Опубликовать статью, а точнее функцию побудил вопрос на форуме:
Проверка email на валидность
Очень часто приходится проверять данные на правильность их ввода. Ранее разработал функцию которая осуществляет валидацию данных
(e-mail, телефон, БИК, банковский корресподентский счет, банковский расчетный счет, ОГРН, ИНН, СНИЛС). Реализовано в основном с использованием RegExp.
CheckParam("RegExpType"; RegExpType; "Признак:email,phone,рассчет,корсчет,БИК,ИНН,СНИЛС,ОГРН,ФИО,сериядок,номердок") reType = CreateList() reType.Add('email'; '^([\w\-]+\.)*[\w\-]+@([\w\-]+\.)+([\w\-]{2,3})$') reType.Add('phone'; '^(\+7|8)(?:[-()]*\d){10}$') reType.Add('рассчет'; '^(?:[\. ]*\d){20}$') reType.Add('корсчет'; '^(?:[\. ]*\d){20}$') reType.Add('БИК'; '^[0-9]{9}$') reType.Add('СНИЛС'; '^(?:[- ]*\d){11}$') reType.Add('ОГРН'; '^([0-9]{13}|[0-9]{15})$') reType.Add('ИНН'; '^([0-9]{10}|[0-9]{12})$') reType.Add('ФИО'; "^[- \`\'А-Яа-я]+$") reType.Add('сериядок'; '^[-0-9a-zA-Zа-яА-Я]{1,}$') reType.Add('номердок'; '^[\d]{1,}$') RegExp = CreateObject("VBScript.RegExp") RegExp.IgnoreCase = TRUE RegExp.Global = TRUE RegExp.Pattern = reType.ValueByName(RegExpType) if RegExp.Test(InputString) Result = TRUE else Result = FALSE endif // --------------------------------- // проверка корреспондентского счета // --------------------------------- if Result and RegExpType == 'корсчет' InputString = Replace(InputString; '.'; '') InputString = Replace(InputString; ' '; '') RegExp.Pattern = reType.ValueByName('БИК') // если задан БИК и задан верно if not (BIC == '000000000') if RegExp.Test(BIC) InputString = '0' & Copy(BIC; 5; 2) & InputString accountK = ArrayOf(7;1;3;7;1;3;7;1;3;7;1;3;7;1;3;7;1;3;7;1;3;7;1) i = 1 sum = 0 while i < 24 mod = Copy(InputString; i; 1) * accountK[i-1] mod = SQL('select ' & mod & ' % 10') sum = sum + mod i = i + 1 endwhile mod = SQL('select ' & sum & ' % 10') if mod <> 0 Result = FALSE endif else Result = FALSE endif endif endif // -------------------------- // проверка расчетного счета // -------------------------- if Result and RegExpType == 'рассчет' InputString = Replace(InputString; '.'; '') InputString = Replace(InputString; ' '; '') RegExp.Pattern = reType.ValueByName('БИК') // если задан БИК и задан верно if not (BIC == '000000000') if RegExp.Test(BIC) // Для кредитных учреждений, БИК которых оканчивается на 000 и 001 (РКЦ и ГРКЦ) // алгоритм как у корр.счета if Copy(BIC; 7; 3) == '000' or Copy(BIC; 7; 3) == '001' InputString = '0' & Copy(BIC; 5; 2) & InputString else InputString = Copy(BIC; 7; 3) & InputString endif accountK = ArrayOf(7;1;3;7;1;3;7;1;3;7;1;3;7;1;3;7;1;3;7;1;3;7;1) i = 1 sum = 0 while i < 24 mod = Copy(InputString; i; 1) * accountK[i-1] mod = SQL('select ' & mod & ' % 10') sum = sum + mod i = i + 1 endwhile mod = SQL('select ' & sum & ' % 10') if mod <> 0 Result = FALSE endif else Result = FALSE endif endif endif // -------------------------------- // проверка контрольного числа ОГРН // -------------------------------- if Result and RegExpType == 'ОГРН' InputString = Replace(InputString; ' '; '') if Length(InputString) = 13 Remainder = SQL('select ' & Copy(InputString; 1; 12) & ' % 11') if Remainder > 9 Remainder = Remainder - 10 endif if Remainder <> Copy(InputString; 13; 1) Result = FALSE endif else Remainder = SQL('select ' & Copy(InputString; 1; 14) & ' % 13') if Remainder > 9 Remainder = Remainder - 10 endif if Remainder <> Copy(InputString; 15; 1) Result = FALSE endif endif endif // ------------------------------- // проверка контрольного числа ИНН // ------------------------------- if Result and RegExpType == 'ИНН' kINN10_n1 = ArrayOf(2; 4; 10; 3; 5; 9; 4; 6; 8; 0) kINN12_n1 = ArrayOf(3; 7; 2; 4; 10; 3; 5; 9; 4; 6; 8; 0) kINN12_n2 = ArrayOf(7; 2; 4; 10; 3; 5; 9; 4; 6; 8; 0; 0) // Вычисление контрольных цифр 12-значного ИНН if Length(InputString) = 12 // Вычисление контрольной цифры n2 i = 1 sum = 0 while i < 11 sum = sum + (Copy(InputString; i; 1) * kINN12_n2[i-1]) i = i + 1 endwhile Remainder = SQL('select ' & sum & ' % 11') if Remainder = 10 Remainder = 0 endif if Remainder <> Copy(InputString; 11; 1) Result = FALSE endif // Вычисление контрольной цифры n1 if Result i = 1 sum = 0 while i < 12 sum = sum + (Copy(InputString; i; 1) * kINN12_n1[i-1]) i = i + 1 endwhile Remainder = SQL('select ' & sum & ' % 11') if Remainder = 10 Remainder = 0 endif if Remainder <> Copy(InputString; 12; 1) Result = FALSE endif endif // Вычисление контрольных цифр 10-значного ИНН else // Вычисление контрольной цифры n1 i = 1 sum = 0 while i < 10 sum = sum + (Copy(InputString; i; 1) * kINN10_n1[i-1]) i = i + 1 endwhile Remainder = SQL('select ' & sum & ' % 11') if Remainder = 10 Remainder = 0 endif if Remainder <> Copy(InputString; 10; 1) Result = FALSE endif endif endif // --------------------------------- // проверка контрольного числа СНИЛС // --------------------------------- if Result and RegExpType == 'СНИЛС' InputString = Replace(InputString; '-'; '') InputString = Replace(InputString; ' '; '') i = 1 sum = 0 while i < 10 sum = sum + (Copy(InputString; i; 1) * (9 - i + 1)) i = i + 1 endwhile Remainder = SQL('select ' & sum & ' % 101') if sum = 100 or Remainder = 0 or Remainder = 100 if Copy(InputString; 10; 2) <<>> '00' Result = FALSE endif else if Remainder <> Copy(InputString; 10; 2) Result = FALSE endif endif endif RegExp = nil reType = nil
Авторизуйтесь, чтобы написать комментарий