前面提到零长度字符串的输入值不会被验证,而当作验证通过处理,那么除了零长度字符串,还有哪些输入值不会被验证呢?
查看服务器生成的 JS 代码,可以发现在验证之前都要进行如下处理:
function ValidatorTrim(s) {
var m = s.match(/^/s*(/S+(/s+/S+)*)/s*$/);
return (m == null) ? "" : m[1];
}
var m = s.match(/^/s*(/S+(/s+/S+)*)/s*$/);
return (m == null) ? "" : m[1];
}
这段代码在互联网上的解释就是除去字符串两端的空格,这种说法大致是正确的,但更准确的说法是:除去字符串两端的换页符、换行符、回车符、制表符(Tab 制表符)、垂直制表符、英文空格。
再查看验证过程,可以发现:
if (ValidatorTrim(value).length == 0)
return true;
return true;
也就是说按 ValidatorTrim 处理后,如果字符串为零长度,就会直接返回验证通过。但是,这里长度判断通过后,进一步验证(比如正则表达式验证)使用的字符串是输入的原样字符串,不是“掐头去尾”的。
说到这里顺便解释一下上面的正则表达式。
match 使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。
正则表达式 /^/s*(/S+(/s+/S+)*)/s*$/ 中:
- / 是 JS 中正则表达式限定符。
- ^ 是字符串开始。
- $ 是字符串结尾。
- /s 是空格符、制表符、换行符等。
- /S 是非空格符、制表符、换行符等。
- * 是匹配前一个字符零次及以上。
- + 是匹配前一个字符一次及以上。
- () 是一个子表达式。
由于没有指定全局查找 g,并且 () 的优先级很高(仅位于转义符之后),所以返回的数组的第一元素是整个字符串,第二个元素是匹配 (/S+(/s+/S+)*) 的部分,也就是上面说的效果。
Read more: http://www.cftea.com/c/2007/11/04FXPHZL54CPBENV.asp#ixzz0ESCgWy22&B