django 注册、登录及第三方接口程序(3):验证之正则表达式


一、Summarize

了解了Django Auth、知道了如何扩展User,下一步就是完成注册。这里涉及的有以下知识:

1.正则表达式
2.前后台验证
3.验证码(Python)
4.邮件激活
5.xss攻击

以上我列举的或许不完全,希望有人能提醒补充
本期将分以上5个知识点进行系统学习!

二、正则表达式

参考学习:
正则表达式30分钟入门教程
精通 JS正则表达式
常用正则表达式
正则表达式练手
Javascript正则表达式:

文档浏览推荐:javascript正则表达式

1.创建正则表达式的两种方式
2.范围:

g:(global)全文查找
i:(IgnoreCase)忽略大小写
m:(Multiline)多行查找
3.正则表达式相关的属性和方法

4.字符类:
. : IE下[^\n],其它[^\n\r] 匹配除换行符之外的任何一个字符
\d [0-9] 匹配数字
\D [^0-9] 匹配非数字字符
\s [ \n\r\t\f\x0B] 匹配一个空白字符
\S [^ \n\r\t\f\x0B]匹配一个非空白字符
\w [a-zA-Z0-9_]匹配字母数字和下划线
\W [^a-zA-Z0-9_] 匹配除字母数字下划线之外的字符

5.量词(下表量词单个出现时皆是贪婪量词)

代码 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

 Python正则表达式:

关于Python的正则表达式参考以下:


《Python核心编程2》【有很多需要注意的地方在核心笔记中】

Python正则表达式指南【强烈推荐】

需要注意一点是:中文匹配

复制代码
import re
source = "s2f程序员杂志一2d3程序员杂志二2d3程序员杂志三2d3程序员杂志四2d3"
u_str = source.decode('utf8')        # 确保所有编码都为 unicode
reg=u"[\u4e00-\u9fa5]"               # 中文范围 [\u4e00-\u9fa5],使用时要 u[\u4e00-\u9fa5] 确定正则表达式也是 unicode 的
pattern = re.compile(reg)            # 预编译
results =  pattern.findall(u_str)    
for result in results :
  print result
复制代码

 

三、自己项目中的一套验证程序:

 js 验证:

复制代码
function regCheck(type){
    /*
     * 正则表达式匹配
     * auther:BeginMan
     * date:2013/11/4
     */
    var reg = '';
    if(type == 1){                    //用户名校验
        reg = /^[a-z0-9_\-]{2,20}$/ig
    }else if(type == 2){            //密码校验
        reg = /^[a-z0-9_-]{6,18}$/;
    }else if(type == 3){            //邮箱验证
        reg = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;        
    }
    
    return reg;
}
复制代码

注意,关于注册用户名这点,我参考了csdn注册,看它对用户名的处理觉得很高明。如下:

在输出中文用户名时:

复制代码
var us = 表单输入的用户名;
//当如何输入了中文,首先使用'aa'替换所有汉字
var nick2 = us.replace(/[\u4e00-\u9fa5]/g, 'aa');
//如果符合了验证标准
reg = /^[a-z0-9_\-]{2,20}$/ig
则us存入数据库
复制代码

关于后端验证:

注意:由于我没有使用django表单,所以这些验证都需要自己写

复制代码
  #后台校验

            pattern = re.compile(u"[\u4e00-\u9fa5]",re.M)       #匹配中文
            u_us = us.decode('utf8')                            #转换成utf8格式
            if pattern.search(u_us):                            #如果存在汉字
                nick = pattern.sub('aa',u_us)                   #如果出现汉字则替换成'aa'
                if not re.match(r'^[a-z0-9_\-]{2,20}$',nick):
                    msg['err'] = u'用户名格式不对'
                    return HttpResponse(json.dumps(msg,ensure_ascii=False))
            else:
                if not us or not re.match(r'^[a-z0-9_\-]{2,20}$',us):
                    msg['err'] = u'用户名格式不对'
                    return HttpResponse(json.dumps(msg,ensure_ascii=False))
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值