2011-03-12 329 views
2

我想确保电话号码输入正确。它们是英国的数字,不能包含任何符号或字母。它们的长度必须是11。Javascript电话号码验证

所以我曾尝试以下:

else if (phone == null || !phone.toString().match(/^[-]?\d*\.?\d*$/)){ 

但是,这实际上允许任何长度,甚至空白的输入。

我该怎么做才能验证电话号码?我不是那种经验丰富的Javascript。

+0

你从哪里拿到手机?显示手机分配的位置。如果'phone = someElement.value','phone == null'可以省略 – Lekensteyn 2011-03-12 22:51:27

回答

3

是,你应该使用正则表达式,但我会允许用户添加其他字符,以提高可读性。这可能是工作,如果你的手机号码必须是共有11位:

/^(?:\W*\d){11}\W*$/.test(phone.value) 

\W是什么,但数字,字母和下划线,但因为它的目的是允许的空间,点,连字符和斜线,你可以使用代替[ .\-\/]

当字段通过验证后,您可以将其清理成更标准的格式,通常是小组数字(取决于您所在国家的习惯),但可能会从删除所有非数字字符开始。

phone.value = phone.value.replace(/\W+/g, ''); 

如果您允许国际访问代码或其他前缀,数字的位数可能不固定,但实际上取决于前缀。

8

完全匹配11位数字的正则表达式是/^\d{11}$/

0

下一行exactely匹配的电话11个数字:

else if (/^\d{11}$/.test(phone)) { 

我认为phone是一个字符串,如:

var phone = someHtmlFormElement.value; 
0

你想要更多的东西是这样的:/^\d{5} \d{6}$/

此外,如果您要提交这个给你的客户端上做任何验证都需要在服务器上进行重复的服务器,不要忘记,你不能信任的人将无法绕过你的JavaScript

2

英国的数字不是11位数字。它们是9或10位数字的组合,不包括0中继码或+44国家前缀。

规则有些复杂,但可以在少数RegEx模式中定义。

第一步必须调查号码的其余部分之前,剥去+4400 44011 44+44 (0)00 44 (0)011 44 (0)0前缀。

Pattern: ^(\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)(44)\)?[\s-]?)?\(?0?(?:\)[\s-]?)?([1-9]\d{1,4}\)?[\d\s-]+)((?:x|ext\.?|\#)\d{3,4})?$ 

使用上面的图案从$2提取44知道使用国际格式,否则承担国家格式,如果$2为null。

$4中提取可选的分机号码详细信息,并将它们存储起来以备后用。

$3中提取NSN(包括空格,连字符和括号)。删除这些空格,连字符和括号,并使用下面的RegEx模式来验证长度和初始数字。

Pattern: ^((1[1-9]|2[03489]|3[0347]|5[56]|7[04-9]|8[047]|9[018])\d{8}|(1[2-9]\d|[58]00)\d{6}|8(001111|45464\d))$ 

许多更详细的模式可以在别处找到,直到个别地区代码。

0

www.aa-asterisk.org.uk 你可以找到相关的英国电话号码,例如各种图案:

模式:

^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$ 

上述模式匹配可选左括号,其次是00 或011和可选的右括号,然后是可选空间 或连字符,然后是可选的左括号。或者, 最初的开括号后面跟着一个文字+不带空格或连字号的 。前面两个选项中的任何一个都是 ,后面跟着44个可选的右括号,然后是可选的 空格或连字符,然后是可选的括号中的可选0, 后跟可选空格或连字符,然后是可选开口 括号(国际格式)。或者,该模式匹配 可选的首字母开括号,后跟0号码 (国家格式)。

例如,用于匹配一个手机号码,您可以使用下面的函数

function isMobile(v) { 

     //handle leading 0 
     if (v.indexOf('0') === 0) { 
      v = v.substring(1); 
     } 

     var mobile_valid = /^7(?:[1-4]\d\d|5(?:0[0-8]|[13-9]\d|2[0-35-9])|624|7(?:0[1-9]|[1-7]\d|8[02-9]|9[0-689])|8(?:[014-9]\d|[23][0-8])|9(?:[04-9]\d|1[02-9]|2[0-35-9]|3[0-689]))\d{6}$/.test(v); 
     var pager_valid = /^76(?:0[012]|2[356]|4[0134]|5[49]|6[0-369]|77|81|9[39])\d{6}$/.test(v); 

     // https://en.wikipedia.org/wiki/Personal_numbering 
     var personal_number = /^70\d{8}$/.test(v); 

     if (pager_valid || mobile_valid || personal_number) { 
      return true; 
     } 

     return false; 
    } 
0

我亲自测试

/^(\(?(0|\+44)[1-9]{1}\d{1,4}?\)?\s?\d{3,4}\s?\d{3,4})$/ 

/^((0|\+44)7\d{3}\s?\d{6})$/ 

,如果我想挑出移动数字具体。希望这可以帮助。