Проверка данных на валидность

27 0

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

isMatch.zip (6,63 Кб)

 

27
Авторизуйтесь, чтобы оценить материал.
1
Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий