我在某个网站上找到了这个代码,它运行得很好。它验证电话号码是以下格式之一:
(123)456-7890 或 123-456-7890
问题是我的客户(我不知道为什么,也许客户端的东西)想要添加另一种格式,连续十个数字,如下所示: 1234567890 。
我正在使用这个正则表达式,
/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/
如何添加它还验证另一种格式?我对正则表达式不太满意。
答案 0 :(得分:107)
我的选择正则是:
/^[\+]?[(]?[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
答案 1 :(得分:99)
首先,您的格式验证程序显然仅适用于NANP(国家/地区代码+1)数字。您的申请是否会被来自北美以外的电话号码的人使用?如果是这样,您不希望阻止这些人输入完全有效的[国际]号码。
其次,您的验证不正确。 NANP数字的格式为NXX NXX XXXX
,其中N
为数字2-9,X
为数字0-9。此外,区域代码和交换可能不采用N11
形式(以两个结尾),以避免与非地理区域代码中的特殊服务(数字除外)混淆(800,888,877 ,866,855,900)可以进行N11
交换。
所以,你的正则表达式会传递数字(123)123 4566,即使这不是有效的电话号码。您可以将\d{3}
替换为[2-9]{1}\d{2}
来解决此问题。
最后,我感觉你在网络浏览器中验证了用户输入。请记住,客户端验证是only a convenience you provide to the user;您仍然需要在服务器上验证所有输入(再次)。
TL; DR 不要将正则表达式用于validate complex real-world data like phone numbers或URLs。使用specialized library。
答案 2 :(得分:53)
如果您正在寻找10位且只有10位数字,请忽略除数字之外的所有内容 -
return value.match(/\d/g).length===10;
答案 3 :(得分:28)
我要做的是忽略格式并验证数字内容:
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);
}
答案 4 :(得分:27)
以下REGEX将验证以下任何格式:
(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}$/
答案 5 :(得分:21)
/^[+]*[(]{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
这是一个非常宽松的选项,我更喜欢保持这种方式,主要是我在注册表单中使用它,用户需要添加他们的电话号码。 通常用户在执行严格格式规则的表单时遇到问题,我更喜欢用户在将其保存到数据库之前填写显示中的数字和格式。 http://regexr.com/3c53v
答案 6 :(得分:13)
我建议使用更清晰的东西(尤其是想要谁将不得不维护代码)......那么:
var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
formats
.replace(/([\(\)])/g, "\\$1")
.replace(/9/g,"\\d") +
")$");
regexp是从一个清晰的模板构建的吗?添加一个新的可能是明智的,甚至客户本身也可以在“选项”页面中这样做。
答案 7 :(得分:13)
str可以是以下任何一种形式: 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");
答案 8 :(得分:5)
这将有效:
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
?
字符表示前一组应匹配零次或一次。群组(-|\s)
将匹配-
或|
字符。在正则表达式中第二次出现此组后添加?
可以匹配10个连续数字的序列。
答案 9 :(得分:5)
试试这个 - 它也包括对国际格式的验证。
/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g
此正则表达式验证以下格式:
答案 10 :(得分:3)
每个人的答案都很棒,但我认为这是一个更全面的答案......
这是为了在一行中使用单个数字的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
即可我欢迎对此解决方案提出任何建议,更正或批评。据我所知,这符合NANP格式(对于美国号码 - 我在创建时没有验证其他北美国家),避免任何911错误(不能在区号或区域代码中),消除只有555个实际上无效的数字(区域代码555后跟01xx,其中x =任意数字)。
答案 11 :(得分:3)
/^\+?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");
答案 12 :(得分:2)
非常简单
"9001234567".match(/^\d{10}$/g)
答案 13 :(得分:1)
验证电话号码+返回格式化的数据
function validTel(str){
str = str.replace(/[^0-9]/g, '');
var l = str.length;
if(l<10) return ['error', 'Tel number length < 10'];
var tel = '', num = str.substr(-7),
code = str.substr(-10, 3),
coCode = '';
if(l>10) {
coCode = '+' + str.substr(0, (l-10) );
}
tel = coCode +' ('+ code +') '+ num;
return ['succes', tel];
}
console.log(validTel('+1 [223] 123.45.67'));
答案 14 :(得分:1)
console.log("in render: ",this.props.details.length);
TypeError: undefined is not an object (evaluating 'this.props.details.length')
这将验证任何可变格式的电话号码:
\\(?\d{3}\\)?([\-\s\.])?\d{3}\1?\d{4}
找到括号括起来的3位数字。
\\(?\d{3}\\)?
找到任何这些分隔符或
([\-\s\.])?
找到3位数
\d{3}
使用第一个匹配的分隔符 - 这可确保分隔符相同。所以(000)999-5555不会在这里验证,因为有一个空格和破折号分隔符,所以只需删除“\ 1”并替换为分隔符子模式(这样做也将验证非标准格式)。但是,无论如何你都应该格式化用户输入。
\1
找到4位数字
void验证:
顺便说一句,这是因为JavaScript可以双重逃脱。
答案 15 :(得分:1)
这个功能对我们很有用:
let isPhoneNumber = input => {
try {
let ISD_CODES = [93, 355, 213, 1684, 376, 244, 1264, 672, 1268, 54, 374, 297, 61, 43, 994, 1242, 973, 880, 1246, 375, 32, 501, 229, 1441, 975, 591, 387, 267, 55, 246, 1284, 673, 359, 226, 257, 855, 237, 1, 238, 1345, 236, 235, 56, 86, 61, 61, 57, 269, 682, 506, 385, 53, 599, 357, 420, 243, 45, 253, 1767, 1809, 1829, 1849, 670, 593, 20, 503, 240, 291, 372, 251, 500, 298, 679, 358, 33, 689, 241, 220, 995, 49, 233, 350, 30, 299, 1473, 1671, 502, 441481, 224, 245, 592, 509, 504, 852, 36, 354, 91, 62, 98, 964, 353, 441624, 972, 39, 225, 1876, 81, 441534, 962, 7, 254, 686, 383, 965, 996, 856, 371, 961, 266, 231, 218, 423, 370, 352, 853, 389, 261, 265, 60, 960, 223, 356, 692, 222, 230, 262, 52, 691, 373, 377, 976, 382, 1664, 212, 258, 95, 264, 674, 977, 31, 599, 687, 64, 505, 227, 234, 683, 850, 1670, 47, 968, 92, 680, 970, 507, 675, 595, 51, 63, 64, 48, 351, 1787, 1939, 974, 242, 262, 40, 7, 250, 590, 290, 1869, 1758, 590, 508, 1784, 685, 378, 239, 966, 221, 381, 248, 232, 65, 1721, 421, 386, 677, 252, 27, 82, 211, 34, 94, 249, 597, 47, 268, 46, 41, 963, 886, 992, 255, 66, 228, 690, 676, 1868, 216, 90, 993, 1649, 688, 1340, 256, 380, 971, 44, 1, 598, 998, 678, 379, 58, 84, 681, 212, 967, 260, 263],
//extract numbers from string
thenum = input.match(/[0-9]+/g).join(""),
totalnums = thenum.length,
last10Digits = parseInt(thenum) % 10000000000,
ISDcode = thenum.substring(0, totalnums - 10);
//phone numbers are generally of 8 to 16 digits
if (totalnums >= 8 && totalnums <= 16) {
if (ISDcode) {
if (ISD_CODES.includes(parseInt(ISDcode))) {
return true;
} else {
return false;
}
} else {
return true;
}
}
} catch (e) {}
return false;
}
console.log(isPhoneNumber('91-9773207706'));
&#13;
答案 16 :(得分:1)
我必须同意验证电话号码是一项艰巨的任务。 至于这个具体问题,我会改变
的正则表达式/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/
到
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
作为唯一不需要的元素是最后一个破折号/空格。
答案 17 :(得分:1)
Google有一个很好的库来处理Javascript中的电话号码:https://github.com/googlei18n/libphonenumber。也适用于Java和C ++。
我更喜欢使用这些,因为这个必须在生产中经过良好的测试。所以这应该是非常安全的继电器。
答案 18 :(得分:1)
只是想添加专门用于选择非本地电话号码(800和900类型)的解决方案。
(\+?1[-.(\s]?|\()?(900|8(0|4|5|6|7|8)\3+)[)\s]?[-.\s]?\d{3}[-.\s]?\d{4}
答案 19 :(得分:1)
如果您使用输入标记,则此代码将对您有所帮助。我自己编写这段代码,我认为这是在输入中使用的非常好的方法。但你可以用你的格式改变它。它将帮助用户在输入标签上更正其格式。
$("#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;
}
答案 20 :(得分:1)
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
?
字符表示前一组应匹配零次或一次。群组(-|\s)
将匹配-
或|
字符。
答案 21 :(得分:0)
有太多的正则表达式变体无法验证电话号码。我推荐这篇文章: JavaScript: HTML Form - Phone Number validation ,其中为每种情况指定了多个变体。如果您想深入了解正则表达式以获取自定义表达式,可以查看此documentation。
答案 22 :(得分:0)
简单正则表达式:/\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g
查看格式,希望它有效:
444-555-1234
F:246.555.8888
电话:1235554567
答案 23 :(得分:0)
尝试使用此js函数。 如果匹配则返回true,否则返回false Ref
function ValidatePhoneNumber(phone) {
return /^\+?([0-9]{2})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})$/.test(phone);
}
答案 24 :(得分:0)
尝试
/^[\+]?\d{2,}?[(]?\d{2,}[)]?[-\s\.]?\d{2,}?[-\s\.]?\d{2,}[-\s\.]?\d{0,9}$/im
有效格式:
答案 25 :(得分:0)
此正则表达式适用于国际电话号码和多种格式的移动电话号码。
这是正则表达式: / ^(+ {1} \ d {2,3} \ s?[(] {1} \ d {1,3} [)] {1} \ s?\ d + | + \ d {2,3} \ s {1} \ d + | \ d +){1} [\ s |-]?\ d +([\ s |-]?\ d +){1,2} $ /
这是JavaScript函数
function isValidPhone(phoneNumber) {
var found = phoneNumber.search(/^(\+{1}\d{2,3}\s?[(]{1}\d{1,3}[)]{1}\s?\d+|\+\d{2,3}\s{1}\d+|\d+){1}[\s|-]?\d+([\s|-]?\d+){1,2}$/);
if(found > -1) {
return true;
}
else {
return false;
}
}
这将验证以下格式:
+44 07988-825 465(使用连字符代替空格,但只能在+44后面加上空格)
+44(0)7988-825 465(使用连字符代替空格的任何组合,除了在(0)之前或之后不能直接存在连字符,并且(0)之前或之后的空格不必存在)
123 456-789 0123(使用连字符代替空格)
123-123 123(用连字符代替空格)
123 123456(空格可以用连字符代替)
1234567890
所有格式都不能存在双精度空格或双连字符。
答案 26 :(得分:0)
使用印度标准来验证电话号码,例如仅以6、7、8或9开头,且总位数必须为10
该解决方案已经过测试并且可以正常工作
if(phone=='')
{
alert("please fill out the field");
}
if ($('#phone').val()!="")
{
if(!phoneno.test(phone))
{
alert("enter valid phone number with indian standard.")
exit;
}
else
{
alert("valid phone number");
}
}
答案 27 :(得分:0)
尝试
/^(\+{0,})(\d{0,})([(]{1}\d{1,3}[)]{0,}){0,}(\s?\d+|\+\d{2,3}\s{1}\d+|\d+){1}[\s|-]?\d+([\s|-]?\d+){1,2}(\s){0,}$/gm
有效格式
答案 28 :(得分:0)
只要忽略数字以外的所有内容即可。
这是我使用的:
// USA phones should contain at least 10 digits. For Ukrainian phones it's OK to have only 9 digits, without leading 0 and country code prefix: [+380] 88 888-88-88.
String.prototype.isValidPhone = function(digitsCount) {
var str = this.trim().match(/\d/g);
return str && str.length >= (digitsCount || 10); // default is at least 10 digits
}
答案 29 :(得分:0)
我采用了@marty 提供的那个并对其进行了一些修改以适应更多情况:
/^[\+]?([0-9][\s]?|[0-9]?)([(][0-9]{3}[)][\s]?|[0-9]{3}[-\s\.]?)[0-9]{3}[-\s\.]?[0-9]{4,6}$/im
有效格式: