0

我正在尝试使用 javascript 函数验证 html 表单,但该函数永远不会将值与正则表达式匹配,即使它们是正确的。这就是我所拥有的:

function validateForms(form){
var usZipRegex = '^\d{5}[[$-.+ ]?\d{4}]?$|^\d{5}$';
var canZipRegex = '^[ABCEGHJKLMNPRSTVWXY][\d][ABCEGHJKLMNPRSTVWXYZ][\W]?[\d][ABCEGHJKLMNPRSTVWXYZ][\d]$';
var nameRegex = '^[A-Za-z][ -a-zA-Z]+$';
var emailRegex = '^[^\.@]([\w]*\.)*[^\.@]*@[a-zA-Z0-9-]{1,63}(\.[a-zA-Z0-9-]{1,63})+$';
var name = form.name.value;
var zip = form.zip.value;
var email = form.email.value;
var comment = form.comment.value
if(name == "") {
  alert('You must enter your name.');
  return false;
}
if(name != nameRegex) {
  alert('You have entered an invalid name.');
  return false;
}
 if(email == "") {
  alert('You must enter your email.');
  return false;
}
if(email != emailRegex) {
 alert('You have entered an invalid email.');
 return false;
}
  if(zip == "") {
  alert('You must enter your zip code.');
  return false;
}
if((zip != usZipRegex) & (zip != canZipRegex)) {
 alert('You have entered an invalid zip code.');
 return false;
}
 if(comment == "") {
 alert('You must enter a message.');
 return false;
}
return true;
}

(name != nameRegex) 部分总是返回 true,但不应该。(name == "") 部分确实可以自己工作。

4

1 回答 1

3

您正在比较原始字符串,而不是运行正则表达式。name != nameRegex除非该人的名字是字面意思,否则将始终返回 true ^[A-Za-z][ -a-zA-Z]+$。您需要nameRegex正确设置为正则表达式对象,但在您的代码中,它只是一个字符串。您还需要使用testRegExp 对象的其他一种方法来检查匹配项,而不是 ==/!= 运算符。对于其他模式也是如此。

构造正则表达式是通过以下两种方式之一完成的:

var regex1 = /[a-z0-9]/;
var regex2 = new RegExp('[a-z0-9]');

但是,如果你这样做,它只是一个字符串:

var notARegex = '[a-z0-9]';

您的代码应该更接近这种风格:

var nameRegex = /^[A-Za-z][-a-zA-Z ]+$/; //note that the hyphen has been moved
//...
if (!nameRegex.test(name)) {
   alert('You have entered an invalid name.');
   return false;
}

编辑:这里还有更多问题。您的其他正则表达式代码可以使用一些重大改进:

var usZipRegex = /^\d{5}([$.+ -]?\d{4})?$/;
var canZipRegex = /^(?![DFIOQU])[A-Y]\d(?![DFIOQU])[A-Z]\W?\d(?![DFIOQU])[A-Z]\d$/;
var nameRegex = /^[a-z][a-z\s-]+$/i;
var emailRegex = /^[^.@]+@[^.@]{1,63}(\.[^.@]{1,63})+$/i';

我不知道您的加拿大邮政编码模式是否正确,但电子邮件肯定是错误的(电子邮件比您想象的要复杂得多,所以最好对它非常宽容)。

于 2012-04-25T19:55:58.753 回答