基于GB的正则表达式,仅限数字电话号码

时间:2012-07-17 07:41:29

标签: regex validation cakephp

我想要一个正则表达式代码,它只允许使用数字电话号码(例如1234567890)以及GB格式号码(例如123-456-7890)。

此表达式必须适用于这两种情况。

目前我使用的是正常表达式,只允许GB电话号码

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

我还需要帮助才允许使用数字编号。

5 个答案:

答案 0 :(得分:27)

  

英国电话号码应包含11位

英国电话号码通常有9或10位数字,不包括0中继代码或+44国家/地区代码。少数人只有7位数。

  

,通常采用格式(01234)123123

该示例显示英国4 + 6格式编号。英国使用多种格式,包括2 + 8,3 + 7,4 + 6,4 + 5,5 + 5和5 + 4用于地理数字,0 + 10,0 + 9和0 + 7用于非地理数据号。

有一个方便的清单:

http://www.aa-asterisk.org.uk/index.php/Number_format

以任何格式匹配英国电话号码

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

上述模式允许用户以他们熟悉的任何格式输入数字。不要限制用户输入特定格式。

提取NSN,前缀和扩展程序

^(\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)(44)\)?[\s-]?)?\(?0?(?:\)[\s-]?)?([1-9]\d{1,4}\)?[\d[\s-]]+)((?:x|ext\.?|\#)\d{3,4})?$
如果使用国际格式,则$ 2将为'44',否则采用国家格式。

$ 4包含分机号码(如果有)。

$ 3包含NSN部分。

验证和格式化

使用其他RegEx模式检查NSN是否具有此数字范围的正确位数。最后,将数字存储为E.164格式或以E.123格式显示。

英国号码的验证和显示格式RegEx模式的详细列表位于:

Regular Expressions for Validating and Formatting GB Telephone Numbers

这里复制的时间太长,很难维护本文档的多个副本。

答案 1 :(得分:21)

有一些英国电话号码正则表达式here

该页面评分最高的是:

^(((\+44\s?\d{4}|\(?0\d{4}\)?)\s?\d{3}\s?\d{3})|((\+44\s?\d{3}|\(?0\d{3}\)?)\s?\d{3}\s?\d{4})|((\+44\s?\d{2}|\(?0\d{2}\)?)\s?\d{4}\s?\d{4}))(\s?\#(\d{4}|\d{3}))?$

它被描述为:

Matches     +447222555555   | +44 7222 555 555 | (0722) 5555555 #2222
Non-Matches (+447222)555555 | +44(7222)555555  | (0722) 5555555 #22

我个人不会在电话号码上加上严格的正则表达式,除非绝对需要让用户使用实际的电话号码进行身份验证或涉及付款。有很多电话号码的变化,有些用户甚至可以使用Skype作为他们的主要电话,通过验证你只会阻止/挫败用户。

另请注意,您的英国格式错误,英国电话号码应包含11位数字,通常格式为(01234)123123 - 我们从不使用短划线,第一个号码应始终是一个0。

答案 2 :(得分:0)

测试英国电话号码有点复杂,因为不同省份的格式差异很大。查看此link以了解英国电话号码可以使用的格式数量。

使用

^((((\(?0\d{4}\)?\s?\d{3}\s?\d{3})|(\(?0\d{3}\)?\s?\d{3}\s?\d{4})|(\(?0\d{2}\)?\s?\d{4}\s?\d{4}))(\s?\(\d{4}|\d{3}))?)|((\+44\s?7\d{3}|\(?07\d{3}\)?)\s?\d{3}\s?\d{3})|((((\+44\s?\d{4}|\(?0\d{4}\)?)\s?\d{3}\s?\d{3})|((\+44\s?\d{3}|\(?0\d{3}\)?)\s?\d{3}\s?\d{4})|((\+44\s?\d{2}|\(?0\d{2}\)?)\s?\d{4}\s?\d{4}))(\s?\(\d{4}|\d{3}))?$

使用regexlib.com

中的信息创建

与正则表达式匹配的值:

01222 555 555 | (010)55555555#2222 | 0122 555 5555#222 | 07222 555555 | (07222)555555 | +44 7222 555 555 | +447222555555 | +44 7222 555 555 | (0722)5555555#2222

与正则表达式不匹配的值:

01222 555 5555 | (010)55555555#22 | 0122 5555 5555#222 | 7222 555555 | +44 07222 555555 | (+447222)555555 | (+447222)555555 | +44(7222)555555 | (0722)5555555#22

答案 3 :(得分:0)

请注意,英国数字始终是+44或0或0044之后的10个数字,而不是上述所有数字(如果我错了,请纠正我)

要避免使用大量正则表达式,可以使用此正则表达式

^(\+44\s?\d{10}|0044\s?\d{10}|0\s?\d{10})?$

附带一个空间修剪器。例如在PHP

trimmedPhoneNumber= preg_replace('/\s+/', '', $phoneNumber);

答案 4 :(得分:0)

更简单的版本:

^((\+44)|(0)) ?\d{4} ?\d{6}$