Javascript Regex - 使用什么来验证电话号码

Javascript Regex - What to use to validate a phone number?

本文关键字:验证 电话号码 什么 Regex Javascript      更新时间:2023-09-26

谁能告诉我正则表达式将如何验证国际电话号码,包括数字之间的空格,并允许这些字符:- ( )

字符串中的数字数量不是太重要,我只是希望用户能够键入类似示例 1 或 2 的内容,如果他们愿意的话:

例:

  1. +44 (0) 207 111 1111

  2. 442071111111

我已经通读并测试了一些类似问题的已发布答案,但到目前为止,它们都没有按照我想要的方式为我工作。

请有人帮我清楚地解释一下应该如何编写上述内容以进行验证吗?

非常感谢任何可以提供帮助的人。

试试这段代码

网页代码

<input type="text" id="phone"/>

JS代码

$("#phone").blur(function() {
  var regexp = /^['s()+-]*([0-9]['s()+-]*){6,20}$/
  var no = $("#phone").val();
  if (!regexp.test(no) && no.length < 0) {
    alert("Wrong phone no");
  }
});

请参阅电话号码验证的综合正则表达式

快速备忘单

  • 开始表达式:/^
  • 如果需要空格,请使用:['s]'s
  • 如果要要求括号,请使用:[(][)]。 使用'(')是丑陋的,可能会使事情变得混乱。
  • 如果您希望任何内容是可选的,请在其后放置一个?
  • 如果需要连字符,只需键入 -[-] 。但是,如果您没有将其放在一系列其他字符的第一位或最后,则可能需要对其进行转义:'-
  • 如果要在插槽中接受不同的选项,请在选项两边加上括号:[-.'s]将需要连字符、句点或空格。 最后一个括号后面的问号将使该插槽的所有这些选项都是可选的。
  • 'd{3} : 需要 3 位数字:000-999。 的简写 [0-9][0-9][0-9] .
  • [2-9] :该插槽需要一个数字 2-9。
  • ('+|1's)? :接受"加号"或 1 和空格(管道字符 | 是"或"),并使其成为可选。 必须转义"加号"。
  • 如果您希望特定号码与插槽匹配,请输入它们: [246]需要 2、4 或 6。[77|78]将需要 77 或 78。
  • $/:结束表达式

这是一个很长的正则表达式,但它支持两种格式(例如 2 是有效的国际数字,必须以 + 或 00 开头):

/^(?:(?:'(?(?:00|'+)([1-4]'d'd|[1-9]'d?)')?)?['-'.' '''/]?)?((?:'(?'d{1,}')?['-'.' '''/]?){0,})(?:['-'.' '''/]?(?:#|ext'.?|extension|x)['-'.' '''/]?('d+))?$/i

这允许扩展以及格式和分隔符的多种选择。

比赛:

  • (+351) 282 43 50 50
  • 90191919908
  • 555-8909
  • 001 6867684
  • 001 6867684x1
  • 1 (234) 567-8901
  • 1-234-567-8901 转1234
  • 1-234-567-8901 ext1234
  • 1-234 567.89/01 分机号码1234
  • 1(234)5678901×1234
  • (123)8575973
  • (0055)(123)8575973

在$n上,它会保存:

  1. 国家指标
  2. 电话号码
  3. 扩展

这里给出了相同的答案:用于电话号码验证的综合正则表达式(直接链接到我的答案)

/*
@isValidUSPhoneFormat function will check valid US Format
    Allowed US Format
(123) 456-7890
123-456-7890
123.456.7890
1234567890
(734) 555.1212
*/   
    function isValidUSPhoneFormat(elementValue){  
            var phoneNumberPattern = /^[(]{0,1}[0-9]{3}[)]{0,1}[-'s.]{0,1}[0-9]{3}[-'s.]{0,1}[0-9]{4}$/;  
            if(phoneNumberPattern.test(elementValue) == false)
            {
                 var phoneNumberPattern = /^('()?'d{3}('))?(.|'s)?'d{3}(.|'s)'d{4}$/; 
                 return phoneNumberPattern.test(elementValue);   
            }
            return phoneNumberPattern.test(elementValue);  
        }

愿这能帮助你理解JavaScript RegEx。

甚至不要尝试。尝试防范您认为无效的输入可能会导致无法输入完全有效的电话号码的愤怒用户。如果用户真的想输入无效的电话号码,他/她无论如何都可以这样做。

function checkPhoneNumber(val) {
    var num = document.getElementById(val).value;
    var mob=/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-'s'./0-9]*$/g;
    if (mob.test(num) == false) {
        alert("Please Enter Valid Phone Number.");
        document.getElementById(val).value = "";
        return false;
    }
     if (num.length > 15) {
        alert("Only 15 characters allowed for Phone Number field.");
        document.getElementById(val).value = "";
        return false;
    }
    return true;
}

试试看

尝试使用 libphonenumber-js 包的 isValidPhoneNumber(phoneNumber, countryCode) 方法。首先是开头带有"+"的电话号码。第二个参数是国家/地区代码(例如:"US"、"IN")。这有助于您准确验证任何国际号码。

国际电话号码的最佳库:谷歌/libphonenumber

下面是 CDN 的示例:

<script src="https://cdn.jsdelivr.net/npm/google-libphonenumber@3/dist/libphonenumber.min.js"></script>
// Format Phone Number
function formatPhone(p) {
  var phoneUtil = libphonenumber.PhoneNumberUtil.getInstance();
  var parsedPhone = phoneUtil.parse(p);
  if (phoneUtil.isValidNumber(parsedPhone)) {
    return phoneUtil.format(parsedPhone, libphonenumber.PhoneNumberFormat.INTERNATIONAL)
  } else {
    return NaN
  }
}

以松散的方式验证国际电话号码的更好选择如下。这不是严格的验证

/^''s*(?:+?(''d{1,3}))?([-.(](''d{3})[-. )])?((''d{3})[-. ](''d{2,4})(?:[-.x ](''d+))?)''s*$/gm

一个工作的Javascript函数看起来像这样

function validatePhone(phone) {
    var regex = /^'s*(?:'+?('d{1,3}))?([-. (]*('d{3})[-. )]*)?(('d{3})[-. ]*('d{2,4})(?:[-.x ]*('d+))?)'s*$/gm;
    return regex.test(phone);
}
console.log(validatePhone('+973 11111111')) // true
console.log(validatePhone('+973 XX77yyss')) // false

对于那些希望了解更多关于角色的人:

  • ^ 断言一行
    开头的位置
  • ''s 匹配任何空格字符(相当于 [''r'''t''f''v ])
  • * 在零次和无限次之间匹配以前的令牌,尽可能多地,根据需要回馈(贪婪)
    非捕获组 (?:+?(''d{1,3}))?
  • ?在零到一次之间匹配以前的令牌,尽可能多地匹配,根据需要回馈(贪婪)
  • +
  • 从字面上匹配索引为 4310(2B16 或 538)的字符 +(区分大小写)
  • ? 在零到一之间匹配前一个令牌,尽可能多地匹配,根据需要回馈(贪婪)
    第一次捕获组 (''d{1,3})
  • ''d 匹配数字(相当于 [0-9])
  • {1,3} 匹配前一个令牌 1 到 3 次,尽可能多,根据需要回馈(贪婪)
    第二次捕获组 ([-.(](''d{3})[-. )])
  • ? 在零到一之间匹配以前的令牌,尽可能多地匹配,根据需要回馈(贪婪)
    匹配单个下面列表中的字符 [-.(]
  • * 在零次和无限次之间匹配以前的令牌,尽可能多地,根据需要回馈(贪婪)
  • -. ( 匹配列表中的单个字符 -。( (区分大小写)第 3 个捕获组 (''d{3})
  • ''d 匹配数字(相当于 [0-9])
  • {3} 与前一个令牌正好匹配 3 次
    匹配下面列表中存在的单个字符 [-. )]
  • * 在零次和无限次之间匹配以前的令牌,尽可能多地,根据需要回馈(贪婪)
  • -. )匹配列表中的单个字符 -。)(区分大小写)
    第 4 捕获组 ((''d{3})[-. ](''d{2,4})(?:[-.x](''d+))?
    第5俘虏大队(''d{3})
  • ''d 匹配数字(相当于 [0-9])
  • {3}与前一个令牌正好匹配 3 次
    匹配下面列表中存在的单个字符 [-. ]
  • * 在零次和无限次之间匹配以前的令牌,尽可能多地,根据需要回馈(贪婪)
  • -. 匹配列表中的单个字符 -。 (区分大小写)
    第 6 捕获组 (''d{2,4})
  • ''d 匹配数字(相当于 [0-9])
  • {2,4} 与前一个令牌匹配 2 到 4 次,尽可能多地匹配,根据需要回馈(贪婪)
    非捕获group (?:[-.x ]*(''d+))?
  • ? 在零到一之间匹配以前的令牌,尽可能多地匹配,根据需要回馈(贪婪)
    匹配单个下面列表中存在的字符 [-.x ]
  • * 在零次和无限次之间匹配以前的令牌,尽可能多地,根据需要回馈(贪婪)
  • -.x 匹配列表中的单个字符 -.x(区分大小写) 第 7 个捕获组 (''d+)

  • ''d 匹配数字(相当于 [0-9])
  • + 在一次到无限次之间匹配以前的令牌,尽可能多地,根据需要回馈(贪婪)
  • ''s 匹配任何空格字符(相当于 [''r'''t''f''v ])
  • * 在零次和无限次之间匹配以前的令牌,尽可能多地,根据需要回馈(贪婪)
  • $ 断言行尾的位置

这将对以下模式和更多
模式检测呈阳性+42 555.123.4567 +1-(800)-123-4567 +7 555 1234567 +7(926)1234567 (926) 1234567 +79261234567 926 1234567 9261234567 1234567 123-4567 123-89-01 495 123