现在,我们要来弄点新奇的玩意了。你可以使用JavaScript 来判断某个文本值是否与预定义的模式相符,比如说电子邮件地址、社会保险号码、日期或是账号等等。我们将创建一个例子,用来判断某个值看起来是否是有效的电话号码。但是,不管你需要强制哪种模型,都可以使用类似的方法来进行。
下面我们定义我们的新函数isAPhoneNumber():
function isAPhoneNumber(entry) {
//don't bother validating the pattern if
//no value was passed in
if (entry) {
//parse the value into small subsections
varopenParen
= entry.substring(0,1);
varareaCode
= entry.substring(1,4);
varcloseParen
= entry.substring(4,5);
var exchange = entry.substring(5,8);
var dash = entry.substring(8,9);
var line = entry.substring(9,13);
如果你细分这一大堆的程序代码,你会发现很容易理解。首先,if (entry) 检查是否存在一个输入值。如果存在的话,代码会使用JavaScript substring() 函数将输入值划分或者称解析成独立的块。
方法substring() 功能非常强大,但是它并不怎么直观。这个方法所返回的是一个字符串的部分(用户输入的日期),是以你所传递给它的第一个参数开始,以传递给它的最后一个参数结束的部分。就像C 语言一般,JavaScript 将第一个数字视为第0个元素。因此,举例来说,如果你输入"(123)456-7890",那么entry.substring(0,1) 就只会返回第一个字符,也就是"(";entry.substring(1,4) 则返回"123";entry.substring(4,5) 则返回")";其它依此类推。
一旦我们将数据解析为正确的部分,我们就可以按照我们的模式来检查它们:
//now check each of the subsections
//individually
if ((openParen !=
"(")
|| (!isANumber(areaCode,
"phone number - area code"))
|| (closeParen !=
")")
|| (!isANumber(exchange,
"phone number - exchange"))
|| (dash != "-")
|| (!isANumber(line,
"phone number - line"))) {
alert("Please enter phone
number
in the following
format: (123)456-7890");
}
}
}
第二步,if 语句检查每一部分,如果只有一个部分不符合我们期望,那么整个电话号码就被视为无效。用中文来说,上面的代码可以翻译为下面的语句:“如果openParen看上去不对(或是areaCode不是数字,或closeParen看起来不对)或是电话号码的交换部分不是数字,亦或是连字号(或电话号码的排列部分)看起来不对,那么就要求用户重新输入电话号码。”
透过将模式解析为不同的部分,我们就能独立地测试每一部分。这样就能够确切地告诉告诉用户到底是哪部分的值有问题。将事情分开来进行能够使代码编写起来更加容易:注意,在检验模式的每个数字部分时,都调用同一个isANumber() 函数。