github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/internal/pkg/helper/column-vaildator.go (about)

     1  package helper
     2  
     3  import (
     4  	"regexp"
     5  	"strconv"
     6  	"strings"
     7  	"time"
     8  )
     9  
    10  func IsMobilePhone(str string) (ret bool) {
    11  	regx := regexp.MustCompile(`^1([38][0-9]|14[579]|5[^4]|16[6]|7[1-35-8]|9[189])\d{8}$`)
    12  	ret = regx.MatchString(str)
    13  
    14  	return
    15  }
    16  
    17  func IsTelPhone(str string) (ret bool) {
    18  	regx := regexp.MustCompile(`[0-9\-\(\)()]*[0-9]{4,}$`)
    19  	ret = regx.MatchString(str)
    20  
    21  	return
    22  }
    23  
    24  func IsIDCard(id string) bool {
    25  	id = strings.ToUpper(id)
    26  	if len(id) != 15 && len(id) != 18 {
    27  		return false
    28  	}
    29  	r := regexp.MustCompile("(\\d{15})|(\\d{17}([0-9]|X))")
    30  	if !r.MatchString(id) {
    31  		return false
    32  	}
    33  	if len(id) == 15 {
    34  		tm2, _ := time.Parse("01/02/2006", string([]byte(id)[8:10])+"/"+string([]byte(id)[10:12])+"/"+"19"+string([]byte(id)[6:8]))
    35  		if tm2.Unix() <= 0 {
    36  			return false
    37  		}
    38  		return true
    39  	} else {
    40  		tm2, _ := time.Parse("01/02/2006", string([]byte(id)[10:12])+"/"+string([]byte(id)[12:14])+"/"+string([]byte(id)[6:10]))
    41  		if tm2.Unix() <= 0 {
    42  			return false
    43  		}
    44  		// 检验18位身份证的校验码是否正确。
    45  		// 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
    46  		arrInt := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
    47  		arrCh := []string{"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}
    48  		sign := 0
    49  		for k, v := range arrInt {
    50  			intTemp, _ := strconv.Atoi(string([]byte(id)[k : k+1]))
    51  			sign += intTemp * v
    52  		}
    53  		n := sign % 11
    54  		valNum := arrCh[n]
    55  		if valNum != string([]byte(id)[17:18]) {
    56  			return false
    57  		}
    58  		return true
    59  	}
    60  }