电子邮件验证
正则表达式(regular expression, 常常缩写为RegExp) 是一种用特殊符号编写的模式,描述一个或多个文本字符串。使用正则表达式匹配文本的模式,这样脚本就可以轻松的识别和操作文本。其实,正则表达式是值得大家花时间学习的。正则表达式不仅在javaScript 中有用,在其他许多地方也可以使用正则表达式,例如其他编程语言(比如Perl,Java,C#,Python 和PHP ),Apache 配置文件以及BBEdit 和TextMate 等文本编辑器。甚至Adobe Dreamweaver 和Microsoft Word( 在一定程度上) 使用正则表达式也可以实现更强大的搜索和替换。
下面是一个验证电子邮件的正则表达式
var re = /^/w+([/.-]?/w+)*@/w+([/.-]?/w+)*(/./w{2,3})+$/ ;
下面我们开始剖析这个正则表达式
re 是一个变量, 用来存储右边的正则表达式,在javascript 中,声明变量使用Var 关键字。
正则表达式的阅读顺序是从左向右的
正则表达式总是以(/) 开头和结尾,斜杠之间的所有内容都是正则表达式的组成部分。
脱字符(^) 表示我们要使用这个表达式来检查以特定字符串开头的字符串。如果去掉脱字符,那么即使字符串开头有一堆垃圾字符,电子邮件地址也可能被认为是有效的。
表达式/w 表示任意单一字符,包括a~z 、A~Z 、0~9 或下划线。电子邮件必须这些字符之一开头。
加号+ 表示我们要寻找前面条目的一次或多次出现。
园括号() 表示一个组,这意味着后面要引用圆括号中的所有内容,所以现在将它们放在一个组中。
放括号[] 用来表示可以出现其中的任意一个字符。在这个示例中,方括号内包含字符/.- 。我们希望允许用户输入点号或连字符,但是点号对于正则表达式有特殊的意义,所以需要在它前面加上反斜杠/, 在特殊字符前加反斜杠表示“对字符转义”,经转义后的字符表示其本身意义。因为有方括号,输入字符串在这个位置可以有一个点号或一个连字符,但是两种不能同时存在。
问号?表示前面的条目可以出现一次或不出现。所以电子邮件地址的第一部分中可以有一个点号或一个连字符,也可以没有。
在?后面,再次使用/w+ ,表示点号或连字符后面必须有其他字符。
在()后面出现的* 号,表示前面的条目可以出现零次或多次。所以圆括号中的内容可以出现零次或多次。
@ 字符代表其本身,没有任何其他意义,这个字符位于电子邮件地址和域名之间。
@ 字符后再次出现/w+ ,表示@ 后必须出现字符。在此之后,再次出现([/.-]?/w+)*, 表示电子邮件地址的后缀中允许出现点号或连字符。
然后,在一对圆括号中建立另一个组(/./w{2,3}), 表示我们希望找到一个点号,后面跟一些字符。在这个示例中,花括号中的数字表示前面的条目可以出现2 到3 次。在这个组的后面是一个+ 号,表示前面的条目(这个组)必须出现一次或多次。这会匹配.com 或.edu 之类的,也与ox.ac.uk 匹配。
最后,正则表达式的末尾是一个美元符号$ ,表示匹配的字符串必须在这里结束。斜杠结束正则表达式。
验证文件名
var re=/^(file|http):/S+///S+/.(gif|jpg|jpeg|png)$/i ;
我们希望检测输入的整个字段,所以正则表达式以/^ 开头,以$/ 结束。输入可以以文本http 或file 开头,所以将这两字符串放在一个组中,用| 分隔,表示两者可以接受其中之一。无论用户是从本地硬盘还是从Web 获得图像,:// 几个字符都是必须的,所以接下来检查这些字符。
在此之后,可以出现任何字符,所以使用/S+ 表示后面是一个或多个非空格字符。然后需要另一个前向斜杠来分隔域名和文件名,然后是另一个/S+ ,用来处理文件名。
文件名需要以点号和gif 、jpg 、jpeg 和png 结束。点号经过转义,两个后缀组合在一起,表示接受其中之一。
在这个正则表达式后面,使用修饰符i 允许用户输入大写或小写字母。这个修饰符让正则表达式不区分
小写。
提取字符串,并对字符串进行格式化
用户常常很随意的输入数据。如果你希望输入符号一种标准格式,那么最好自己处理格式化。以下是一个javascript 脚本的一个函数,它的主要作用是获得用户输入的姓名列表,然后将这些姓名格式化输出。
function regExp(inNameList) {
var newNames = new Array;
var newNameField = "" ;
// 提取字符串的正则表达式
var re = //s*/n/s*/;
var nameList = inNameList.split(re);
// 格式化
re = /^(/S)(/S+)/s(/S)(/S+)$/;
for (var k=0; k<nameList.length; k++) {
if (nameList[k]) {
// 搜索匹配
re.exec(nameList[k]);
// 将格式化后的字符串放入newNames 数组中
newNames[k] = RegExp.$1.toUpperCase() + RegExp.$2.toLowerCase() + " " + RegExp.$3.toUpperCase() + RegExp.$4.toLowerCase();
}
}
// 格式化输出
for (k=0; k<newNames.length; k++) {
newNameField += newNames[k] + "/n" ;
}
return newNameField;
}
1. var re = //s*/n/s*/; 它的搜索文本模式是由任何空白字符(/s*), 然后是换行符(/n), 再后同样是任何空白字符(/s*) 组成,
2. var nameList = inNameList.split(re); 字符串方法split() 获得正则表达式,并且将它应用于inNameList 中的数据。每个换行符分隔一个姓名,split() 将每行上的输入数据分隔开。结果是一个姓名的字符串数组,其中每个数组元素都是一个姓名。
3. re = /^(/S)(/S+)/s(/S)(/S+)$/; 将姓和名分开为4 个部分:名字的首字母^(/S) 、名字的剩余字符(/S+) 、姓的首字母(/S) 、姓的其他字符(/S+) ;
4. re.exec(nameList[k]); 使用exec() 方法在字符串nameList[k] 上执行正则表达式re, 从而将字符串分为4 个部分,并且自动地设置JavaScript 内置的RegExp 对象。这4 个部分分别存储在RegExp.$1 、RegExp.$2 、RegExp.$3 、RegExp.$4 中。
5. newNames[k] = RegExp.$1.toUpperCase() + RegExp.$2.toLowerCase() + " " + RegExp.$3.toUpperCase() + RegExp.$4.toLowerCase(); 将转换后的姓名存储在newNames 中。