【问题标题】:Validate phone number using javascript使用 javascript 验证电话号码
【发布时间】:2013-08-24 22:00:46
【问题描述】:

我正在尝试使用 JavaScript 验证电话号码,例如 123-345-3456(078)789-8908。 这是我的代码

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。 谁能解释一下原因?

【问题讨论】:

    标签: javascript regex validation


    【解决方案1】:

    用于验证电话号码的 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
    XXXXXXXXX

    如果要在数字前使用+号,请按以下方式
    +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;
      }
    }
    

    【讨论】:

    • 不客气.. 谢谢指正.. @Stano
    • 这将匹配 (123-456 7890123).456-7890,我确定这是需要的。
    • 我无法理解你在做什么.. 可以简单解释一下@M42
    • 试试我给出的例子。括号在您的正则表达式中是可选的,因此您可以有一个但不能有第二个。此外,如果有一个连字符作为第一个分隔符,您接受点作为第二个分隔符...
    • 能否请您指出您的答案来自这里(除非这是您自己的帖子或其他内容):w3resource.com/javascript/form/phone-no-validation.php
    【解决方案2】:

    这个正则表达式/^(\([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

    【讨论】:

    • 它将匹配 (123- 456-7890123)456-7890,我不确定是否需要。
    【解决方案3】:

    我是这样做的。

    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。

      【讨论】:

        【解决方案5】:

        谁能解释原因

        因为您的正则表达式与输入匹配。只是输入还包括额外的字符。您包含 '^' 来表示行首,但是(正如 Andy 所说)您应该包含 '$' 来表示行尾。

        如果您的正则表达式以“^”开头并以“$”结尾,那么它将只匹配仅与您的正则表达式匹配的行。

        通过以“^”开始您的正则表达式而不以“$”结尾,您可以匹配以匹配您的正则表达式的序列开头的行,但行可以在匹配序列的后面有任何其他内容。

        【讨论】:

          【解决方案6】:

          你可以使用这个 jquery 插件:

          http://digitalbush.com/projects/masked-input-plugin/

          请参阅演示选项卡,电话选项。

          【讨论】:

            【解决方案7】:

            谁能解释一下原因??

            发生这种情况是因为您的正则表达式不以任何锚元字符结尾,例如行尾 $ 或单词边界 \b

            因此,当您询问正则表达式引擎 123-345-34567 是否是有效的电话号码时,它会尝试在此字符串中查找匹配项,因此它将 123- 与此部分匹配 (\([0-9]{3}\) |[0-9]{3}-) 然后它将345- 与此部分匹配[0-9]{3}- 然后匹配 3456 与这部分 [0-9]{4}

            现在引擎发现它已经遍历了整个正则表达式,并在您的输入中找到了一个与正则表达式匹配的字符串,尽管在输入字符串中留下了一个字符-数字 7-,所以它停止了并返回成功,因为它找到了匹配的子字符串。

            如果您在正则表达式的末尾包含了$\b,引擎会以与以前相同的方式运行,然后它会尝试匹配$\b,但会找到最后一个数字- 7 - 而且它不是单词边界\b 也不是行尾$ 所以它会停止并且找不到匹配项。

            【讨论】:

              【解决方案8】:

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

              假设您正在验证美国的电话号码,这将起到作用。

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

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

              之后,我们重复第一步并允许 0 或 1 个右括号 \)?

              对于第二个分组,我们首先允许空格或连字符 0 或 1 次 ((\s|\-){1})?

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

              【讨论】:

                【解决方案9】:

                在 JavaScript 中,以下正则表达式可用于电话号码:

                ^((\+1)?[\s-]?)?\(?[1-9]\d\d\)?[\s-]?[1-9]\d\d[\s-]?\d\d\d\d

                例如; 9999875099、8750999912等

                参考:https://techsolutions.filebizz.com/2020/08/regular-expression-for-phone-number-in.html

                【讨论】:

                  【解决方案10】:

                  在正则表达式末尾添加单词边界\b

                  /^(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}\b/
                  

                  如果) 后面的空格是可选的:

                  /^(\([0-9]{3}\)\s*|[0-9]{3}-)[0-9]{3}-[0-9]{4}\b/
                  

                  【讨论】:

                  • 这个正则表达式对于(078)789-8908 也失败了。请参阅我在 Andy 帖子中的评论。
                  【解决方案11】:

                  在正则表达式的末尾添加一个 $ 表示模式的结束:

                  var regExp = /^(\([0-9]{3}\)\s?|[0-9]{3}-)[0-9]{3}-[0-9]{4}$/;
                  

                  【讨论】:

                  • 由于空间问题,(078)789-8908 失败。你应该在那里添加一个?
                  • 问题中的示例中没有空格,但我会修改我的答案。
                  • 你的验证了有空格的,而不是没有空格的。
                  • 固定以考虑可选空间。
                  【解决方案12】:

                  如果您使用输入标签,则此代码将对您有所帮助。我自己编写了这段代码,我认为这是在输入中使用的非常好的方法。但您可以使用您的格式更改它。它将帮助用户更正输入标签的格式。

                  $("#phone").on('input', function() {  //this is use for every time input change.
                          var inputValue = getInputValue(); //get value from input and make it usefull number
                          var length = inputValue.length; //get lenth of input
                  
                          if (inputValue < 1000)
                          {
                              inputValue = '1('+inputValue;
                          }else if (inputValue < 1000000) 
                          {
                              inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, length);
                          }else if (inputValue < 10000000000) 
                          {
                              inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, length);
                          }else
                          {
                              inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, 10);
                          }       
                          $("#phone").val(inputValue); //correct value entered to your input.
                          inputValue = getInputValue();//get value again, becuase it changed, this one using for changing color of input border
                         if ((inputValue > 2000000000) && (inputValue < 9999999999))
                        {
                            $("#phone").css("border","black solid 1px");//if it is valid phone number than border will be black.
                        }else
                        {
                            $("#phone").css("border","red solid 1px");//if it is invalid phone number than border will be red.
                        }
                    });
                  
                      function getInputValue() {
                           var inputValue = $("#phone").val().replace(/\D/g,'');  //remove all non numeric character
                          if (inputValue.charAt(0) == 1) // if first character is 1 than remove it.
                          {
                              var inputValue = inputValue.substring(1, inputValue.length);
                          }
                          return inputValue;
                  }
                  

                  【讨论】:

                    【解决方案13】:
                    /^1?\s?(\([0-9]{3}\)[- ]?|[0-9]{3}[- ]?)[0-9]{3}[- ]?[0-9]{4}$/
                    

                    这将验证所有美国风格的数字,带或不带 1,以及带或不带括号的区号(但如果使用,请正确使用。IE(902-455-4555 将不起作用,因为没有右括号。如果需要,它还允许 - 或集合之间的空格。)它将适用于 op 提供的示例。

                    【讨论】:

                      【解决方案14】:

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

                      【讨论】:

                      • 请添加一些描述来解释您的代码。
                      【解决方案15】:

                      function validatePhone(inputtxt) {
                        var phoneno = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;
                        return phoneno.test(inputtxt)
                      }

                      【讨论】:

                        猜你喜欢
                        • 2014-11-30
                        • 2011-05-19
                        • 1970-01-01
                        • 2011-09-05
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多