【IT168 技术文档】摘要:
本文是
《程序员必须掌握的基础正则表达式》
的后续,我们将带领大家探索正则表达式在Web应用中的用途,通过最常见的一些判断功能的实现,让大家领略正则表达式的强大之处。
在接下去的文章里我假设你已经有一些正则表达式的基本知识。如果你是一个正则表达式的新手(我喜欢称做 /n0{2}b/)。(译者注:原文是N00b,是newbie的 网络 缩写),或者你需要快速的回顾一下,可以去看看我的前一篇文章《程序员必须掌握的基础正则表达式》,它不会让你失望的。
好了,废话不多说,下面我列出我在日常web开发工作中发现的五个最有用的正则表达式。
匹配一个用户名
这个表达式非常简单,可是在你想为一个站点建立用户注册系统的时候确实非常有价值。为了开发上的简便,我们通常希望把用户起名字能用的字符限制在一个有限的集合里(比如一些敏感的字眼或者可能用来做注入攻击的名字,象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}$/
下面是一个PHP的代码片段,演示如何在产品中使用这个表达式(我们也可以同样应用在perl、Java、ruby甚至javacript里面做这种检验工作)。
在接下去的文章里我假设你已经有一些正则表达式的基本知识。如果你是一个正则表达式的新手(我喜欢称做 /n0{2}b/)。(译者注:原文是N00b,是newbie的 网络 缩写),或者你需要快速的回顾一下,可以去看看我的前一篇文章《程序员必须掌握的基础正则表达式》,它不会让你失望的。
好了,废话不多说,下面我列出我在日常web开发工作中发现的五个最有用的正则表达式。
匹配一个用户名
这个表达式非常简单,可是在你想为一个站点建立用户注册系统的时候确实非常有价值。为了开发上的简便,我们通常希望把用户起名字能用的字符限制在一个有限的集合里(比如一些敏感的字眼或者可能用来做注入攻击的名字,象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}$/
下面是一个PHP的代码片段,演示如何在产品中使用这个表达式(我们也可以同样应用在perl、Java、ruby甚至javacript里面做这种检验工作)。