使用JavaScriptvalidation电话号码

我在一些网站上发现了这个代码,它完美的工作。 它validation电话号码是以下格式之一:
(123)456-7890123-456-7890

问题是,我的客户(我不知道为什么,也许是客户的东西)想要连续添加另一个格式,十个数字,像这样: 1234567890

我正在使用这个正则expression式,

/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/ 

我如何添加它也validation另一种格式? 我不擅长正则expression式。

首先,你的格式validation器显然只适用于NANP (国家代码+1)号码。 您的应用程序是否会被来自北美以外的电话号码的人使用? 如果是这样,你不想阻止这些人input一个完全有效的[国际]号码。

其次,你的validation是不正确的。 NANP编号采用NXX NXX XXXX的forms,其中N是数字2-9, X是数字0-9。 此外,地区代码和交换可能不采取N11forms(以两个1结尾)以避免与特殊服务混淆, 非地理区域代码(800,888,877,866,855,900)中的号码可能有N11交换。

所以,你的正则expression式将通过数字(123)123 4566,即使这不是一个有效的电话号码。 您可以通过用[2-9]{1}\d{2}replace\d{3}来解决这个问题。

最后,我感觉你正在validation用户在网页浏览器中的input。 请记住,客户端validation只是您提供给用户的便利 ; 您仍然需要validation服务器上的所有input(再次)。

TL; DR不使用正则expression式来validation复杂的真实世界的数据,如电话号码或URL 。 使用专门的图书馆 。

我select的正则expression式是:

 /^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im 

有效格式:

(123)456-7890
(123)456-7890
123-456-7890
123.456.7890
1234567890
31636363634
075-63546725

如果你正在寻找10和10位数字,忽略所有的数字,

  return value.match(/\d/g).length===10; 

以下REGEX将validation以下任何格式:

(123)456-7890
123-456-7890
123.456.7890
1234567890

 /^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/ 

我要做的是忽略格式并validation数字内容:

 var originalPhoneNumber = "415-555-1212"; function isValid(p) { var phoneRe = /^[2-9]\d{2}[2-9]\d{2}\d{4}$/; var digits = p.replace(/\D/g, ""); return phoneRe.test(digits); } 

具有超过200个国家/地区的元数据的Javascript电话号码parsing器: https : //github.com/googlei18n/libphonenumber

其中str可以是以下任何forms:555​​-555-5555(555)555-5555(555)555-5555 555 555 5555 5555555555 1 555 555 5555

 function telephoneCheck(str) { var isphone = /^(1\s|1|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/.test(str); alert(isphone); } telephoneCheck("1 555 555 5555"); 

我会build议使用更清楚的东西(尤其是思考谁将不得不维护代码)…那么:

 var formats = "(999)999-9999|999-999-9999|9999999999"; var r = RegExp("^(" + formats .replace(/([\(\)])/g, "\\$1") .replace(/9/g,"\\d") + ")$"); 

正则expression式是从一个明确的模板构build的? 添加一个新的将是一个不费脑筋,甚至可能是客户本身能够在“选项”页面中做到这一点。

 /^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]*$/g 

(123)456-7890
+(123)456-7890
+(123)-456-7890
+(123) – 456-7890
+(123) – 456-78-90
123-456-7890
123.456.7890
1234567890
31636363634
075-63546725

这是一个非常松散的select,我宁愿这样保持,大多数情况下我用它在用户需要添加他们的电话号码的registry格。 通常用户在执行严格格式规则的表单时遇到问题,我更喜欢用户填写数字和格式,或者在保存到数据库之前填写格式。 http://regexr.com/3c53v

这将工作:

 /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/ 

这个? 字符表示前面的组应匹配零次或一次。 组(-|\s)将匹配a -或a | 字符。 添加? 在你的正则expression式中第二次出现这个组后,可以让你匹配连续10个数字的序列。

每个人的回答都很好,但是我认为这个更全面一些。

这是写在JavaScript匹配使用一个单一的数字在一行:

 ^(?!.*911.*\d{4})((\+?1[\/ ]?)?(?![\(\. -]?555.*)\( ?[2-9][0-9]{2} ?\) ?|(\+?1[\.\/ -])?[2-9][0-9]{2}[\.\/ -]?)(?!555.?01..)([2-9][0-9]{2})[\.\/ -]?([0-9]{4})$ 

如果你想匹配字边界,只需要将^和$更改为\ b

我欢迎任何对此解决scheme的build议,更正或批评。 据我所知,这匹配的NANP格式(美国数字 – 我没有validation其他北美国家创build此时),避免任何911错误(不能在地区代码或地区代码),消除只有555个实际上是无效的号码(地区码555,后面跟着01xx,其中x =任意数字)。

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

这个? 字符表示前面的组应匹配零次或一次。 组(-|\s)将匹配a -或a | 字符。

我必须同意,validation电话号码是一项艰巨的任务。 至于这个具体的问题,我会改变正则expression式

 /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/ 

 /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/ 

因为不必要的唯一一个元素是最后一个破折号/空格。

如果你使用input标签比这个代码将帮助你。 我自己编写这个代码,我认为这是在input中使用的很好的方法。 但你可以使用你的格式来改变它。 它将帮助用户更正input标签上的格式。

 $("#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; } 

简单正则expression式:/ /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g

检查格式,希望它的作品:
444-555-1234
F:246.555.8888
L:1235554567

只是想添加一个专门为select非本地电话号码(800和900型)的解决scheme。

 (\+?1[-.(\s]?|\()?(900|8(0|4|5|6|7|8)\3+)[)\s]?[-.\s]?\d{3}[-.\s]?\d{4} 

试试这个 – 它也包括国际格式的validation。

/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g

这个正则expression式validation以下格式:

  • (541)754-3010国内
  • + 1-541-754-3010国际
  • 1-541-754-3010在美国拨号
  • 001-541-754-3010从德国拨打
  • 191 541 754 3010从法国拨号

????/ ^ + 1 \ S *(\ d {3}(:) | [ – | \ S])\ S * \ d {3} [ – | \ S]????\ d {4 } $ /

虽然这篇文章是一个古老但想离开我的贡献。 这些被接受:5555555555 555-555-5555 (555)555-5555 1(555)555-5555 1 555 555 5555 1 555-555-5555 1(555)555-5555

这些不被接受:555-5555 – >接受这个用法:^ +?1?\ s *?(?(\ d {3})?(?:) | [ – | \ s])?\ s * ?\ d {3} [ – | \ s]?\ d {4} $ 5555555 – >接受这个用法:^ +?1?\ s *?(?(\ d {3})? | [ – | \ s])?\ s *?\ d {3} [ – | \ s]?\ d {4} $ 1 555)555-5555 123 **&!! asdf#55555555(6505552368)2 (757)622-7382 0(757)622-7382 -1(757)622-7382 2 757 622-7382 10(757)622-7382 27576227382(275)76227382 2(757)6227382 2(757)622-7382 (555)5(55) – 5555

这是我使用的代码:

 function telephoneCheck(str) { var patt = new RegExp(/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/); return patt.test(str); } telephoneCheck("+1 555-555-5555");