github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/03_form/demo02_checkform.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"net/http"
     7  	"regexp"
     8  	"strconv"
     9  )
    10  
    11  func register(w http.ResponseWriter, r *http.Request) {
    12  
    13  	//r.FormValue("username") 这个可以不需要提前调用 ParseForm()
    14  	// 只会返回同名参数中的第一个,若参数不存在则返回空字符串。
    15  
    16  	r.ParseForm()
    17  	//1.验证必填字段
    18  	username := r.Form.Get("username")
    19  	if len(username) == 0 {
    20  		fmt.Println("用户名不能为空!")
    21  		fmt.Fprintf(w, "用户名不能为空!") //这个写入到w的是输出到客户端的
    22  	}
    23  	//2.验证数字
    24  	age, err := strconv.Atoi(r.Form.Get("age"))
    25  	if err != nil {
    26  		//数字转化出错了,那么可能就是不是数字
    27  		fmt.Println("您输入的不是数字!")
    28  		fmt.Fprintf(w, "您输入的不是数字!") //这个写入到w的是输出到客户端的
    29  	}
    30  	//接下来就可以判断这个数字的大小范围了
    31  	if age > 100 || age < 0 {
    32  		//太大了或太小了
    33  		fmt.Println("您输入的年龄太大了或太小了,请输入0-100之间的整数!")
    34  		fmt.Fprintf(w, "您输入的年龄太大了或太小了,请输入0-100之间的整数!") //这个写入到w的是输出到客户端的
    35  	}
    36  	//或者正则表达式
    37  	if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {
    38  		fmt.Println("验证有误,您输入的年龄太大了或太小了!")
    39  		fmt.Fprintf(w, "验证有误,您输入的年龄太大了或太小了!")
    40  	}
    41  
    42  	//3.验证中文
    43  	if m, _ := regexp.MatchString(`^[\x{4e00}-\x{9fa5}]+$`, r.Form.Get("zhname")); !m {
    44  		fmt.Println("验证有误,请输入中文!")
    45  		fmt.Fprintf(w, "验证有误,请输入中文!")
    46  	}
    47  
    48  	//4. 验证英文
    49  	if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("enname")); !m {
    50  		fmt.Println("验证有误,请输入英文!")
    51  		fmt.Fprintf(w, "验证有误,请输入英文!")
    52  	}
    53  
    54  	//5. 邮箱
    55  	if m, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})$`, r.Form.Get("email")); !m {
    56  		fmt.Println("请输入正确邮箱地址")
    57  		fmt.Fprintf(w, "验证有误,请输入正确邮箱地址!")
    58  	}
    59  
    60  	//6. 验证手机号
    61  	if m, _ := regexp.MatchString(`^(1[3|5|6|7|8][0-9]\d{8})$`, r.Form.Get("mobile")); !m {
    62  		fmt.Println("请输入正确手机号码")
    63  		fmt.Fprintf(w, "验证有误,请输入正确手机号码!")
    64  	}
    65  
    66  	//7. 下拉菜单
    67  	xueli := r.Form.Get("xueli")
    68  	res1 := checkSelect(xueli)
    69  	if !res1 {
    70  		fmt.Println("请选择正确的下拉列表!")
    71  		fmt.Fprintf(w, "请选择正确的下拉列表!")
    72  	}
    73  
    74  	// 8. 单选按钮
    75  	sex := r.Form.Get("sex")
    76  	res2 := checkSex(sex)
    77  	if !res2 {
    78  		fmt.Println("请选择正确的性别!")
    79  		fmt.Fprintf(w, "请选择正确的性别!")
    80  	}
    81  
    82  	// 9. 复选框
    83  	hobby := r.Form["hobby"]
    84  	res3 := checkHobby(hobby)
    85  	if !res3 {
    86  		fmt.Println("请选择正确的爱好!")
    87  		fmt.Fprintf(w, "请选择正确的爱好!")
    88  	}
    89  	// 10 身份证号
    90  	//验证18位身份证,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
    91  	if m, _ := regexp.MatchString(`^(\d{17})([0-9]|X)$`, r.Form.Get("usercard")); !m {
    92  		fmt.Println("请选择正确的身份证号!")
    93  		fmt.Fprintf(w, "请选择正确的身份证号!")
    94  	}
    95  
    96  	//fmt.Println("验证成功!")
    97  	//fmt.Fprintf(w, "验证成功!")
    98  }
    99  
   100  func checkHobby(hobby []string) bool {
   101  	slice := []string{"game", "girl", "money", "power"}
   102  	hobby2 := Slice_diff(hobby, slice)
   103  	if hobby2 == nil {
   104  		return true
   105  	}
   106  	return false
   107  }
   108  
   109  func Slice_diff(slice1, slice2 []string) (diffslice []string) {
   110  	for _, v := range slice1 {
   111  		if !InSlice(v, slice2) {
   112  			diffslice = append(diffslice, v)
   113  		}
   114  	}
   115  	return
   116  }
   117  
   118  /**
   119  判断是一个切片中是否包含指定的数值
   120  */
   121  func InSlice(val string, slice []string) bool {
   122  	for _, v := range slice {
   123  		if v == val {
   124  			return true
   125  		}
   126  	}
   127  	return false
   128  }
   129  
   130  /**
   131  验证单选按钮
   132  */
   133  func checkSex(sex string) bool {
   134  	slice := []string{"male", "female", "other"}
   135  	for _, v := range slice {
   136  		if v == sex {
   137  			return true
   138  		}
   139  	}
   140  	return false
   141  }
   142  
   143  /**
   144  验证下拉列表
   145  */
   146  func checkSelect(xueli string) bool {
   147  	slice := []string{"xiaoxue", "chuzhong", "gaozhong", "dazhuan", "benke", "shuoshi", "boshi", "lieshi"}
   148  	for _, v := range slice {
   149  
   150  		if v == xueli {
   151  			return true
   152  		}
   153  	}
   154  	return false
   155  }
   156  func main() {
   157  	http.HandleFunc("/register", register)   //设置访问的路由
   158  	err := http.ListenAndServe(":8000", nil) //设置监听的端口
   159  	if err != nil {
   160  		log.Fatal("ListenAndServe: ", err)
   161  	}
   162  }
   163  
   164  /*
   165  验证数字:^[0-9]*$
   166  验证n位的数字:^\d{n}$
   167  验证至少n位数字:^\d{n,}$
   168  验证m-n位的数字:^\d{m,n}$
   169  验证零和非零开头的数字:^(0|[1-9][0-9]*)$
   170  验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
   171  验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
   172  验证非零的正整数:^\+?[1-9][0-9]*$
   173  验证非零的负整数:^\-[1-9][0-9]*$
   174  验证非负整数(正整数 + 0) ^\d+$
   175  验证非正整数(负整数 + 0) ^((-\d+)|(0+))$
   176  验证长度为3的字符:^.{3}$
   177  验证由26个英文字母组成的字符串:^[A-Za-z]+$
   178  验证由26个大写英文字母组成的字符串:^[A-Z]+$
   179  验证由26个小写英文字母组成的字符串:^[a-z]+$
   180  验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
   181  验证由数字、26个英文字母或者下划线组成的字符串:^\w+$
   182  验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。
   183  验证是否含有 ^%&',;=?$\" 等字符:[^%&',;=?$\x22]+
   184  验证汉字:^[\u4e00-\u9fa5],{0,}$
   185  验证Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
   186  验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
   187  验证电话号码:^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。
   188  验证身份证号(15位或18位数字):^\d{15}|\d{}18$
   189  验证一年的12个月:^(0?[1-9]|1[0-2])$ 正确格式为:“01”-“09”和“1”“12”
   190  验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为:01、09和1、31。
   191  整数:^-?\d+$
   192  非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$
   193  正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
   194  非正浮点数(负浮点数 + 0) ^((-\d+(\.\d+)?)|(0+(\.0+)?))$
   195  负浮点数 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
   196  浮点数 ^(-?\d+)(\.\d+)?$
   197  */