匹配用户名的正则表达式

这个表达式非常简单,可是在你想为一个站点建立用户注册系统的时候确实非常有价值。为了开发上的简便,我们通常希望把用户起名字能用的字符限制在一个有限的集合里(比如一些敏感的字眼或者可能用来做注入攻击的名字,象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}$/ 

你可能感兴趣的:(匹配用户名的正则表达式)