繁体   English   中英

Javascript 正则表达式 - 使用什么来验证电话号码?

[英]Javascript Regex - What to use to validate a phone number?

谁能告诉我什么 RegEx 可以用来验证国际电话号码,包括号码之间的空格,还允许这些字符: - ( )

字符串中的数字数量不太重要,我希望用户能够根据需要输入示例 1 或 2 之类的内容:

例子:

  1. +44 (0) 207 111 1111

  2. 442071111111

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

请有人帮我清楚地解释上面应该如何编写以进行验证?

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

试试这个代码

HTML代码

<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 x1234
  • 1-234-567-8901 分机 1234
  • 1-234 567.89/01 分机 1234
  • 1(234)5678901x1234
  • (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')。 这有助于您准确验证任何国际号码。

国际电话号码的最佳库: google/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 看起来像这样

 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

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

  • ^在一行的开头断言 position
  • \s匹配任何空白字符(相当于 [\r\n\t\f\v ])
  • *在零次和无限次之间匹配前一个令牌,尽可能多次,根据需要回馈(贪心)
    非捕获组 (?:+?(\d{1,3}))?
  • 在零到一次之间匹配前一个标记,尽可能多次,根据需要回馈(贪婪)
  • +匹配字符 + 索引为 4310(2B16 或 538)字面(区分大小写)
  • 在零到一次之间匹配前一个标记,尽可能多次,根据需要回馈(贪婪)
    第一捕获组 (\d{1,3})
  • \d匹配一个数字(相当于[0-9])
  • {1,3}匹配前一个标记 1 到 3 次,尽可能多的次数,按需回馈(贪心)
    第二捕获组 ([-. (] (\d{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 次,尽可能多的次数,根据需要回馈(贪心)
    非捕获组 (?:[-.x ]*(\d+))?
  • 在零到一次之间匹配前一个标记,尽可能多次,根据需要回馈(贪婪)
    匹配下面列表中的单个字符 [-.x ]
  • *在零次和无限次之间匹配前一个令牌,尽可能多次,根据需要回馈(贪心)
  • -.x匹配列表中的单个字符 -.x(区分大小写)
    第 7 捕获组 (\d+)
  • \d匹配一个数字(相当于[0-9])
  • +在一次和无限次之间匹配前一个令牌,尽可能多次,根据需要回馈(贪婪)
  • \s匹配任何空白字符(相当于 [\r\n\t\f\v ])
  • *在零次和无限次之间匹配前一个令牌,尽可能多次,根据需要回馈(贪心)
  • $在行尾断言 position

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM