36

我正在尝试使用 JavaScript123-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。谁能解释为什么?

4

15 回答 15

47

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

如果要在数字前使用 + 号,请按以下方式
+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;
  }
}
于 2013-08-22T09:16:16.313 回答
33

此正则表达式/^(\([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
于 2013-08-22T09:07:20.743 回答
6

这是我的做法。

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

于 2019-01-17T23:53:38.237 回答
4

这是迄今为止我发现使用 javascript 正则表达式检查电话号码格式的最简单方法。此特定示例检查它是否是 10 位数字。

<input name="phone" pattern="^\d{10}$" type="text" size="50">

如果模式与值不匹配,则单击提交按钮时输入字段会被标记,不需要其他 css 或 js。

于 2016-07-28T19:38:24.063 回答
2

谁能解释为什么

因为您的正则表达式确实与输入匹配。只是输入还包括额外的字符。你包括'^'来表示行的开头,但是(正如安迪所说)你应该包括'$'来表示行的结束。

如果您以 '^' 开始您的正则表达式并以 '$' 结束它,那么它将仅匹配仅与您的正则表达式匹配的行。

通过以 '^' 开始您的正则表达式而不以 '$' 结束它,您可以匹配以与您的正则表达式匹配的序列开头的行,但行可以在匹配序列之后包含任何其他内容。

于 2013-08-22T09:21:00.600 回答
1

你可以使用这个 jquery 插件:

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

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

于 2013-08-22T09:12:35.707 回答
1

谁能解释一下为什么??

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

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

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

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

于 2013-08-22T09:19:44.207 回答
1

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

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

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

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

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

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

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

于 2016-01-29T16:25:39.160 回答
1

在 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

于 2020-10-08T14:08:07.397 回答
0

\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/
于 2013-08-22T09:06:10.423 回答
0

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

var regExp = /^(\([0-9]{3}\)\s?|[0-9]{3}-)[0-9]{3}-[0-9]{4}$/;
于 2013-08-22T09:06:17.450 回答
0

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

$("#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;
}
于 2017-04-16T04:06:15.107 回答
0
/^1?\s?(\([0-9]{3}\)[- ]?|[0-9]{3}[- ]?)[0-9]{3}[- ]?[0-9]{4}$/

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

于 2019-01-22T22:03:42.600 回答
0

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

于 2021-06-23T03:01:02.540 回答
-1

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

于 2017-03-07T01:47:33.593 回答