使用javascript验证电话号码

41
我想验证电话号码,例如123-345-3456(078)789-8908,我正在使用JavaScript。这是我的代码。
function ValidateUSPhoneNumber(phoneNumber) {
  var regExp = /^(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}/;
  var phone = phoneNumber.match(regExp);
  if (phone) {
    alert('yes');
    return true;
  }
  alert('no');
  return false;
}

我正在使用ValidateUSPhoneNumber('123-345-34567')测试此函数,最后一个破折号前面有5个数字,按照正则表达式是无效的。但这个函数返回true。有人能解释一下为什么吗?

17个回答

56

使用JavaScript验证电话号码:

function phonenumber(inputtxt) {
  var phoneno = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;
  if(inputtxt.value.match(phoneno)) {
    return true;
  }
  else {
    alert("message");
    return false;
  }
}

以上脚本匹配以下格式:

XXX-XXX-XXXX
XXX.XXX.XXXX
XXX XXX XXXX

如果想要在以下方式中号码前使用加号:
+XX-XXXX-XXXX
+XX.XXXX.XXXX
+XX XXXX XXXX
请使用以下代码:

function phonenumber(inputtxt) {
  var phoneno = /^\+?([0-9]{2})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})$/;
  if(inputtxt.value.match(phoneno)) {
    return true;
  }  
  else {  
    alert("message");
    return false;
  }
}

这将匹配(123-456 7890123).456-7890,我相信这是想要的。 - Toto
我不明白你在做什么,能简要解释一下吗?@M42 - coolprarun
只需尝试我提供的示例即可。在您的正则表达式中,括号是可选的,因此您可以有一个但不是第二个。此外,如果有连字符作为第一个分隔符,则接受点作为第二个分隔符... - Toto
因为如果我们正在验证用户输入,剥离特殊字符并询问“这是一个10位数字吗?”会更容易一些。如果是的话,可以对该数字的组成进行一些逻辑处理。然后按需要重新格式化它。这比试图制作完美的正则表达式要容易得多。 - Secesh
1
请问您能否引用一下您的答案来自这里(除非那是你在那里发布的或其他什么):http://www.w3resource.com/javascript/form/phone-no-validation.php - Qantas 94 Heavy
显示剩余4条评论

35

这个正则表达式 /^(\([0-9]{3}\)\s*|[0-9]{3}\-)[0-9]{3}-[0-9]{4}$/ 可以验证以下所有格式:

'123-345-3456';
'(078)789-8908';
'(078) 789-8908'; // Note the space

解析一下正在发生的事情:

正则表达式可视化

  1. 起始组验证两种方式,要么是(XXX),要么是XXX-,在关闭括号后可以有空格。
  2. 组后面的部分检查XXX-XXX

1
它将匹配(123- 456-7890123)456-7890,我不确定这是否是想要的。 - Toto

7

这是我做法。

function validate(phone) {
  const regex = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;
  console.log(regex.test(phone))
}

validate('1234567890')     // true
validate(1234567890)       // true
validate('(078)789-8908')  // true
validate('123-345-3456')   // true


4

这是我发现的使用JavaScript正则表达式检查电话号码格式最简单的方法。这个例子检查是否为10位数字。

<input name="phone" pattern="^\d{10}$" type="text" size="50">
标签会在点击提交按钮时,如果输入的值不符合指定的格式,则被标记为有误,无需任何 CSS 或 JS 支持。

2

^(\(?[0-9]{3}\)?)((\s|\-){1})?[0-9]{3}((\s|\-){1})?[0-9]{4}$

如果你正在验证美国电话号码,这个正则表达式可以解决问题。

首先,我们允许以0或1个开括号开始\(?

然后,我们允许3个连续的数字在0-9之间[0-9]{3}

接下来,我们重复第一步并允许0或1个闭合括号\)?

对于第二组,我们从允许一个空格或一个破折号0或1次开始((\s|\-){1})?

这在第二个和第三个数字组之间重复,并检查3个连续数字,然后四个连续数字来结束它。对于美国电话号码,我认为这涵盖了人们可能格式化号码的许多不同方式,但限制足以防止他们传递不合理的字符串。


2
由于你的正则表达式确实匹配了输入,只是输入还包括额外的字符。你使用'^'表示行首,但(如安迪所说)你应该使用'$'来表示行尾。
如果你在正则表达式开头加上'^',并在结尾加上'$',那么它只会匹配完全符合你的正则表达式的行。
通过以'^'开头而没有以'$'结尾的正则表达式,你可以匹配以与你的正则表达式相匹配的序列开头的行,但行尾可以有任何其他内容。

1

1
这是因为你的正则表达式没有以任何锚点元字符结尾,例如行尾符$或单词边界\b。所以当你询问正则表达式引擎是否123-345-34567是有效的电话号码时,它会在该字符串中查找匹配项,因此它将123-与(\([0-9]{3}\)|[0-9]{3}-)这部分匹配,然后它将345-与[0-9]{3}-这部分匹配,然后它将3456与[0-9]{4}这部分匹配。现在引擎发现它已经遍历了整个正则表达式,并在输入字符串中找到了一个与正则表达式匹配的字符串,尽管输入字符串中留下了一个字符 - 数字7-,所以它停止并返回成功,因为它找到了一个子字符串匹配。
如果您在正则表达式的结尾处包含了$\b,引擎将按照之前的方式进行匹配,然后尝试匹配$\b,但却找到了最后一个数字- 7 -,它既不是单词边界\b也不是行末$,因此停止匹配并未找到匹配项。

1

0

如果传递的字符串看起来像一个有效的美国电话号码,则返回true。

function isValidPhoneNumber(phoneNumber) {
  const regex = /^(1\s?)?(\(\d{3}\)|\d{3})[\s\-]?\d{3}[\s\-]?\d{4}$/;
  return regex.test(phoneNumber);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接