使用 JavaScript 验证电话号码

IT技术 javascript regex
2021-01-16 18:22:02

我在一些网站上找到了这段代码,它运行良好。它验证电话号码是否采用以下格式之一:
(123) 456-7890123-456-7890

问题是我的客户(我不知道为什么,也许是客户的东西)想要添加另一种格式,连续十个数字,如下所示:1234567890

我正在使用这个正则表达式,

/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/

我如何添加它也验证另一种格式?我不擅长正则表达式。

6个回答

我选择的正则表达式是:

/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im

有效格式:

(123) 456-7890
(123)456-7890
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725

这个正则表达式很棒,因为如果您删除^开头和$结尾的 ,它也可以在字符串中间找到电话号码
2021-03-20 18:22:02
什么是 /im ?在谷歌上找不到解释:)
2021-03-22 18:22:02
@darioxlz '123456789' 不是电话号码的有效长度
2021-03-26 18:22:02
@SarinSuriyakooni使表达式不区分大小写并m执行多行搜索
2021-03-30 18:22:02
为什么你需要对数字不区分大小写?
2021-04-09 18:22:02

首先,您的格式验证器显然只适用于NANP(国家代码 +1)数字。拥有北美以外电话号码的人会使用您的应用程序吗?如果是这样,您不想阻止这些人输入完全有效的 [国际] 号码。

其次,您的验证不正确。NANP 数字采用以下形式NXX NXX XXXX,其中N是 2-9 位数字和X0-9 位数字。此外,N11为了避免与特殊服务混淆,区号和交换可能不会采用(以两个结尾)形式非地理区号(800、888、877、866、855、900)中的数字可能有N11交换。

因此,您的正则表达式将传递号码 (123) 123 4566,即使该号码不是有效的电话号码。您可以通过替换\d{3}[2-9]{1}\d{2}.

最后,我感觉您正在验证 Web 浏览器中的用户输入。请记住,客户端验证只是您提供给用户的一种便利您仍然需要(再次)验证服务器上的所有输入。

TL;DR不使用正则表达式来验证复杂的现实世界数据,如电话号码URL使用专门的库

问题是在前端应用程序中捆绑 libphonenumber 需要 >500Kb。bundlephobia.com/package/google-libphonenumber@3.2.22)我认为如果您想进行电话号码验证,这是一个很好的起点:github.com/google/libphonenumber/blob/master/FALSEHOODS.md 鉴于复杂性我也会考虑使用专门的在线服务,例如:validatephonenumber.com
2021-03-13 18:22:02
我同意正则表达式不足以验证电话号码,因为电话编号计划实际上是基于范围工作的,例如 12300000 到 12399999(numberingplans.com/...
2021-03-25 18:22:02

如果您正在寻找 10 位且只有 10 位数字,请忽略除数字以外的所有内容-

   return value.match(/\d/g).length===10;
您的意思是 match(/\d/g) 不匹配 (/\d/) 或者长度为 1,而不是 10;此外,空字符串的匹配为空。至少它应该是 var m = value.match(/\d/g); 返回 m && m.length === 10
2021-03-15 18:22:02
我喜欢这个:/\D/gi.test(value)所有不是数字的东西,包括空格、破折号等......
2021-03-17 18:22:02
这是最好的方法。除非你真的关心它是什么格式,否则所有这些都是确保数字是部分有效的,而不是一堆胡言乱语。
2021-03-23 18:22:02
这就是我要提出的建议。轻松活泼的。无论如何,过多的验证可能是一件坏事。
2021-04-01 18:22:02
或者return (value.match(/\d/g) || []).length == 10更简单的(但同样有缺陷):return value.replace(/\D/g,'').length == 10.
2021-04-03 18:22:02
/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]*$/g

(123)456-7890
+(123)456-7890
+(123)-456-7890
+(123) - 456-7890
+(123) - 456-78-90
123-456-7890
123.456.7890
1234567890
31636363634
075-63546725

这是一个非常宽松的选项,我更喜欢保持这种方式,主要是我在用户需要添加电话号码的注册表中使用它。通常用户对强制执行严格格式规则的表单有困难,我更喜欢用户在显示中或在将其保存到数据库之前填写数字和格式。 http://regexr.com/3c53v

最好加个字数限制。用 [8, 14] 更改最后一个 *(星号):/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]{8,14}$/g
2021-03-10 18:22:02
如果你有一个 java 后端,你可以添加电话号码规范化,例如来自github.com/google/libphonenumber
2021-03-14 18:22:02
这个似乎很适合我,因为它不是太紧,而且似乎涵盖了所有国际格式(感谢@RemigiusStalder 对瑞士的修复)
2021-03-29 18:22:02
正则表达式稍作修改以允许例如+41 (79) 123 45 67(瑞士):/^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g
2021-03-30 18:22:02

我要做的是忽略格式并验证数字内容:

var originalPhoneNumber = "415-555-1212";

function isValid(p) {
  var phoneRe = /^[2-9]\d{2}[2-9]\d{2}\d{4}$/;
  var digits = p.replace(/\D/g, "");
  return phoneRe.test(digits);
}
同意忽略格式,例如,手机号码通常带有空格,如 XXXX XXX XXX,但表单要求输入没有空格,即 XXXXXXXXXX。
2021-04-06 18:22:02