《go web 编程》第四章 表单:验证表单的输入
必填字段
想要确保从一个表单元素中得到一个值,例如前面小节里面的用户名,我们如何处理呢?Go 有一个内置函数 len 可以获取字符串的长度,这样我们就可以通过 len 来获取数据的长度,例如:
if len(r.Form["username"][0])==0{
// 为空的处理
}
r.Form 对不同类型的表单元素的留空有不同的处理, 对于空文本框、空文本区域以及文件上传,元素的值为空值,而如果是未选中的复选框和单选按钮,则根本不会在 r.Form 中产生相应条目,如果我们用上面例子中的方式去获取数据时程序就会报错。所以我们需要通过 r.Form.Get() 来获取值,因为如果字段不存在,通过该方式获取的是空值。但是通过 r.Form.Get() 只能获取单个的值,如果是 map 的值,必须通过上面的方式来获取。
数字
想要确保一个表单输入框中获取的只能是数字,例如,你想通过表单获取某个人的具体年龄是 50 岁还是 10 岁,而不是像 “一把年纪了” 或 “年轻着呢” 这种描述
如果我们是判断正整数,那么我们先转化成 int 类型,然后进行处理
getint,err:=strconv.Atoi(r.Form.Get("age"))
if err!=nil{
// 数字转化出错了,那么可能就不是数字
}
// 接下来就可以判断这个数字的大小范围了
if getint >100 {
// 太大了
}
还有一种方式就是正则匹配的方式
if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {
return false
}
对于性能要求很高的用户来说,这是一个老生常谈的问题了,他们认为应该尽量避免使用正则表达式,因为使用正则表达式的速度会比较慢。但是在目前机器性能那么强劲的情况下,对于这种简单的正则表达式效率和类型转换函数是没有什么差别的。如果你对正则表达式很熟悉,而且你在其它语言中也在使用它,那么在 Go 里面使用正则表达式将是一个便利的方式。
Go 实现的正则是 RE2,所有的字符都是 UTF-8 编码的。
中文
有时候我们想通过表单元素获取一个用户的中文名字,但是又为了保证获取的是正确的中文,我们需要进行验证,而不是用户随便的一些输入。对于中文我们目前有两种方式来验证,可以使用 unicode 包提供的 func Is(rangeTab *RangeTable, r rune) bool 来验证,也可以使用正则方式来验证,这里使用最简单的正则方式,如下代码所示
if m, _ := regexp.MatchString("^\\p{Han}+$", r.Form.Get("realname")); !m {
return false
}