用户名验证问题

2012-02-19 21:19:08 +08:00
 kingwkb
用户名至少3个字母或者2个汉字,该如何验证呢?
3907 次点击
所在节点    Python
15 条回复
fanzeyi
2012-02-19 21:30:19 +08:00
def unicode_len(text):
if isinstance(text, str):
return len(text.encode('utf-8'))
return len(text)

俺是这么写的
kingwkb
2012-02-19 21:34:34 +08:00
@fanzeyi

>>> u = '中文'
>>> isinstance(u,str)
True
>>> u = 'aaaa'
>>> isinstance(u,str)
True
>>> u = u'中文'.encode('utf8')
>>> isinstance(u,str)
True
>>> u = u'中文'.encode('gbk')
>>> isinstance(u,str)

这都一个样。。。
iwinux
2012-02-19 21:39:07 +08:00
大致思路是这样的:

pattern = re.compile(r'^([A-Za-z]{3}|{han}{2})$')
valid = pattern.match(name)

可惜的是 Python 的正则没法直接匹配汉字(Ruby 里可以 = =),需要做一些额外处理,可以参考 Stack Overflow 上的这个问答:http://stackoverflow.com/questions/2718196/how-to-find-all-chinese-text-in-a-string-using-python
fanzeyi
2012-02-19 21:39:28 +08:00
....显然是要都化成Unicode然后len就是长度了。。。

In [5]: len(u'测试')
Out[5]: 2

In [6]: len('测试')
Out[6]: 6
fanzeyi
2012-02-19 21:41:02 +08:00
哦我错了应该是decode...
fanzeyi
2012-02-19 21:41:39 +08:00
In [13]: unicode_len(u'测试')
Out[13]: 2

In [14]: unicode_len(u'aaa')
Out[14]: 3

In [15]: unicode_len('aaa')
Out[15]: 3

In [16]: unicode_len('测试')
Out[16]: 2

In [17]: unicode_len('测试aa')
Out[17]: 4

In [18]: unicode_len(u'测试aa')
Out[18]: 4
zythum
2012-02-19 21:50:48 +08:00
经许浩大人调教
/[a-zA-Z]{3}|[\u4e00-\u9fa5]{2}/

应该没问题了
kingwkb
2012-02-19 21:55:12 +08:00
@fanzeyi 用unicode的话,中文和字母都是1,怎么判断中文至少2个,英文3个

比如
用户名是“中文”,这个可以注册,2个中文

用户名是“中”,这个不可以注册

用户名是“aa”,这个不可以注册,英文至少3个
fanzeyi
2012-02-19 21:57:44 +08:00
@kingwkb 哦。。 我错了。。 我以为是合起来的。。 =.=
kingwkb
2012-02-19 21:58:55 +08:00
@zythum 这还是有缺陷

比如:
用户名是“中aa”,这个应该是可以通过的,一个中文可以当2个英文,所以符合英文3+
kingwkb
2012-02-19 22:08:02 +08:00
pattern = re.compile(u'([\u4e00-\u9fa5])')

m = pattern.findall(u'中文dfasdf')
m
[u'\u4e2d', u'\u6587']

>>> pattern = re.compile(u'([a-zA-z0-9])')
>>> m = pattern.findall(u'中文dfasdf')
>>> m
[u'd', u'f', u'a', u's', u'd', u'f']

好吧,这样解决,分开匹配,m相加
kingwkb
2012-02-19 22:09:20 +08:00
这样还有一点不爽是网页提交的是utf8或者gbk,要先转成unicode,哪位还有更好的办法么?
iwinux
2012-02-19 22:13:23 +08:00
@kingwkb 这样可以么:

chinese = re.compile('^[\u4e00-\u9fa5]$')
english = re.compile('^[A-Za-z]$')

chinese_count = 0
english_count = 0

for s in name:
if chinese.match(s):
chinese_count += 1
elif english.match(s):
english_count += 1

valid = (chinese_count >= 2) or (english_count >= 3) or (chinese_count + english_count >= 3)
zythum
2012-02-19 23:27:01 +08:00
@kingwkb 朱一只能测试js,js表示'中aa'是通过不了了...正则不是通用的么
kingwkb
2012-02-20 13:30:55 +08:00
@zythum 这个需要用unicode编码,javascript应该不是unicode,具体的不清楚,可能不是utf8就是gbk,跟网页用的编码有关?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/27725

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX