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