Опубликовать статью, а точнее функцию побудил вопрос на форуме:
Проверка 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
Авторизуйтесь, чтобы написать комментарий