匹配用户名的正则表达式
这个表达式非常简单,可是在你想为一个站点建立用户注册系统的时候确实非常有价值。为了开发上的简便,我们通常希望把用户起名字能用的字符限制在一个有限 的集合里(比如一些敏感的字眼或者可能用来做注入攻击的名字,象delete这种都不能允许),同时我们还要防止有的人恶意冒用别人的用户名(比如一个用 户叫Bill Gates,另一个人起名叫Bill Gates,区别只是两个单词见多了一个空格,当然也可能是换行符这种不可见字符,它们在浏览器里面看上去就象同一个人)。
要是不用正则表达式的话,这个检查会是一个乏味的劳动—先把字符串切割成独立的单词,再一个个检查每个单词的合法性。如果使用正则表达式,就会变成一个很轻松的事情。首先,让我们定义我们想接受的用户名,为了简单起见,我们的示例被限制为只接受下面的条件:
1. 字母数字字符(英文字母和数字)
2. 下划线(_)
与此同时,我们还强制用户名最短3个字符最长不超过16个字符。下面就是符合上述描述条件的正则表达式:
/[a-zA-Z0-9_]{3,16}/
如果你非常熟悉正则表达式的话,你会发现这个表达式好像缺了一些东西。不用着急,接下去我会讲到。
如
果你读过我前面一篇正则表达式的入门文章,你可能已经分析出这个表达式如何工作了。首先,我们定义一个字符分类,它将匹配任何字母(a到z以及A到Z)和
任何数字(0到9),以及_
(下划线)字符。下面接着一个数量范围,它告诉解析引擎我们只接受3到16个之间的字符数量。因为这个数量是指整个字符分类包括的所有字符而不是一个特定
的字符,所以这个数量范围跟在字符分类后面。这个表达式将匹配所有长度在3到16之间,由我们的受限字符集里面字符构成的字符串。
那么
到底缺了什么?由于我们写的表达式是匹配一个字符串的任何部分。它将不止认为‘mike_84′是合法字符串,同样也会匹配类似‘%!
mike_84&’这种包含了我们不希望出现的东西的字符串。我们需要用到行定位点, ^ (caret) 和 $ (dollar)
字符将把我们的表达式限制在一个字符串的起点和终点位置,这样可以确保整个用户名符合我们的设定,而不是一部分。
所以修订版的正则表达式象这样:
/^[a-zA-Z0-9_]{3,16}$/