Javascript正则表达式-如何验证电话号码?

10
请问有什么正则表达式可以验证国际电话号码,包括数字之间的空格,也允许使用这些字符:- ()。字符串中的数字数量并不太重要,我希望用户可以输入类似于示例1或2的内容:
示例:
  1. +44 (0) 207 111 1111

  2. 442071111111

我已经阅读并测试了一些类似问题的答案,但到目前为止,它们都不能按照我的意愿工作。请有人给我提供一个清晰的解释,说明如何编写上述验证的正则表达式?
非常感谢任何能帮忙的人。

示例1与您的描述不匹配。描述似乎不允许前导“+”。 - John Dvorak
以下是有关编程的内容,请将其从英语翻译成中文。仅返回已翻译的文本:参阅下面的链接以获取指导:http://stackoverflow.com/questions/6918185/javascript-regular-expression-phone-number-validation https://dev59.com/UFfUa4cB1Zd3GeqPLMek 这些问题与你的问题相同,因此它将为您提供解决方案。 - adeel iqbal
抱歉,我在描述中漏掉了“+”号。如果可能的话,我想要包含它。 - user2031340
9个回答

16

试试这段代码

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");
  }
});

1
我想这里唯一有趣的部分就是正则表达式本身。 - John Dvorak
2
我的电话号码是 112,但你的正则表达式声称它不正确。 - John Dvorak
谢谢你的关注和帮助。以下是我目前的代码。我能不能只更改检查函数以允许我想要的内容?你觉得呢? - user2031340
function checkNumber(value,nstatus_id){ var reg = /[0-9]/; document.getElementById(nstatus_id).src = (reg.test(value) == false) ? "images/bad.png" : "images/ok.png"; }<td align="left" valign="top">联系电话:</td> <td><input type="text" id="number" name="number" onkeyup="checkNumber(this.value,'nstatus');" onblur="checkNumber(this.value,'nstatus');" maxlength="60" size="30"/></td> <td><img src="images/bad.png" alt="状态" id="nstatus" style="margin-left:5px; vertical-align:middle;" /></td> - user2031340
抱歉啊,朋友,我实在不明白你想要问什么。请提供问题的详细描述并将已经发布的问题链接给我。 - Sagar Hirapara
显示剩余3条评论

13

请查看全面的电话号码验证正则表达式

快速参考表

  • 开始表达式:/^
  • 如果想要强制空格,请使用:[\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。
  • $/:结束表达式

10

这是一个很长的正则表达式,但它支持两种格式(例如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 ext1234
  • 1-234 567.89/01 ext.1234
  • 1(234)5678901x1234
  • (123)8575973
  • (0055)(123)8575973

对于$n,它保存了:

  1. 国家代码
  2. 电话号码
  3. 分机号码

这个相同的答案在这里提供:A comprehensive regex for phone number validation(直接链接到我的回答)


1
@JeanPaul 非常有帮助... 你能告诉我出了什么问题吗? - Ismael Miguel
这非常有帮助。对我很有效。谢谢 - Ankit Sahrawat
@AnkitSahrawat 没关系。如果您发现有任何需要验证但未经过验证的情况,您可以在此处留言,我会进行修复。 - Ismael Miguel
我认为这有点太宽松了,因此我将其扩展部分与@Sagarpatal的答案结合起来创建了这个正则表达式:/^[\s()+-]*([0-9][\s()+-]*){6,20}(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i。它适用于大多数情况并需要超过几个数字。 - Mordred
@Mordred,这肯定是一个不错的选择!它比我的更容易阅读,看起来不像是hacky的,而且实际上很干净(考虑到主题)。 - Ismael Miguel

2

不要试图去做。试图防范你认为是无效的输入可能会导致愤怒的用户无法输入完全有效的电话号码。而且,如果用户真的想输入无效的电话号码,他/她还是能够这样做的。


0
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;
}

尝试一次。

0

最佳国际电话号码库: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
  }
}

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

0
更好的松散验证国际电话号码的选项如下。这不是严格的验证。

/^\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\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 次
    匹配列表中的单个字符 [-. )]
  • * 匹配前面的标记零次或多次,尽可能多地给出(贪婪模式)
  • -. ) (匹配列表中的单个字符 -. )(区分大小写)
    第四个捕获组 ((\d{3})[-. ](\d{2,4})(?:[-.x](\d+))?)
    第五个捕获组 (\d{3})
  • \d 匹配数字(等价于 [0-9])
  • {3} 精确匹配前面的标记 3 次
    匹配列表中的单个字符 [-. ]
  • * 匹配前面的标记零次或多次,尽可能多地给出(贪婪模式)
  • -. (匹配列表中的单个字符 -. )(区分大小写)
    第六个捕获组 (\d{2,4})
  • \d 匹配数字(等价于 [0-9])
  • {2,4} 匹配前面的标记 2 到 4 次,尽可能多地给出(贪婪模式)
    非捕获组 (?:[-.x ]*(\d+))?
  • ? 匹配前面的标记零次或一次,尽可能多地给出(贪

    这将测试以下模式以及更多
    +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


0
/*
@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 正则表达式。


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