【问题标题】:Regular expression for GB based and only numeric phone number基于 GB 且仅数字电话号码的正则表达式
【发布时间】:2021-03-07 20:20:12
【问题描述】:

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

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

目前我正在使用下面的正则表达式,它只允许 GB 电话号码

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

我也需要帮助才能只允许数字。

【问题讨论】:

    标签: regex validation cakephp


    【解决方案1】:

    有一些英国电话号码正则表达式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。

    【讨论】:

    • 我知道这已经有几年的历史了,但要补充一点,请注意在英国也有一些 10 位数字。我的旧公司有一个,这是一个皇家痛苦,因为 99% 的网站都验证了 11。
    • 嘿,只想评论一件事。实际上,这个正则表达式接受“00000000000”。这怎么可能?。我不认为英国确实有这种数字。强烈建议回复此帖子。邓纳姆兹
    • 危机求助热线等的大量号码不会被此抓住。例如 childline 是 0800 1111,samaritans 是 116 123 等等。此外,它似乎与行尾不匹配,当在 regex101 中使用gim 标志进行测试时,它计算了从一行运行到另一行的 11 个数字。
    • 话虽如此,这仍然是最接近的。其余的答案都错得离谱。
    • 我在area-codes.org.uk/formatting.php 找到了所有可能的英国固定电话和移动电话格式的列表(它的准确性尚未经过检查,但它“看起来合法”)你会发现你所做的任何假设像“11 位”或“10 位”之类的距离......
    【解决方案2】:

    英国电话号码应包含 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

    此处复制太长,并且很难维护该文档的多个副本。

    【讨论】:

    • 不,英国号码通常有 11 位数字。
    • @Magic_Matt_Man 重新阅读所说的内容。 '英国电话号码通常有 9 或 10 位数字不包括 0'.
    • 我什至可以得到一个测试号码来匹配这个
    • 有没有任何支持者甚至尝试过这个数字的传播?我在第一个正则表达式的 8 场比赛中得到了 2 场比赛,在第二场比赛中得到了 0 场
    【解决方案3】:

    更简单的版本:

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

    【讨论】:

    • 我尝试了其他解决方案,但它们似乎不适用于 HTML 中的模式标签。这个对我有用。
    【解决方案4】:

    测试英国电话号码有点复杂,因为不同省份的格式完全不同。查看此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

    【讨论】:

      【解决方案5】:

      请注意,英国号码在 +44 或 0 或 0044 之后总是有 10 个号码。(如果我错了,请纠正我)

      为了避免这些大量的正则表达式,你可以使用这个正则表达式

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

      连同空间修剪器。例如在 PHP 中

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

      【讨论】:

      猜你喜欢
      • 2017-09-23
      • 2014-02-15
      • 1970-01-01
      • 2011-09-13
      • 2016-02-02
      相关资源
      最近更新 更多