【问题标题】:PHP: How to validate UK landline and mobile numbers?PHP:如何验证英国的固定电话和手机号码?
【发布时间】:2013-03-15 19:31:11
【问题描述】:

如何验证英国电话号码?我从这个网站复制了答案,但这个答案只接受手机号码。我想同时接受固定电话和手机号码。有可能吗?

            # @reference: http://stackoverflow.com/questions/8099177/validating-uk-phone-numbers-in-php

            $telephone = "01752311149"; // not ok.
            $telephone = "07742055388"; // ok.
            $pattern = "/^(\+44\s?7\d{3}|\(?07\d{3}\)?)\s?\d{3}\s?\d{3}$/";

            if (!preg_match($pattern, $telephone))
            {
                $error = true;
                $message.='<error elementid="telephone" message="invalid" />';
            }

我已经尝试使用下面的这个正则表达式,但它根本不起作用,

#http://stackoverflow.com/questions/14512810/regular-expression-mobile-and-landline-number
$pattern = "/^\(0\d{1,2}\)\d{3}-\d{4}$/";

【问题讨论】:

  • 建议您阅读并了解正则表达式的工作原理,然后修改mobile-accept number。请注意,+441+4420102 都是有效的固定电话号码。
  • 您确定这是个好主意吗?我发现没有什么比仅仅因为我碰巧是外国人而不会接受我的电话号码的表格更令人恼火的了。只要您不实际调用它,您就无法再确定该号码在验证后确实存在 - 请参阅0207 99999999。此外,下次伦敦再次重组其编号计划时(过去 25 年已经进行了 3 次),您必须更新您的正则表达式。
  • 我建议您查看libphonenumber - 它是 Google 在 Android 中用于验证和格式化电话号码的开源库。
  • 感谢您的提示。我只需要在浏览器上进行验证。没有安卓或苹果。谢谢。

标签: php regex preg-match


【解决方案1】:

Regular Expressions for Validating and Formatting GB Telephone Numbers 有一系列用于验证电话号码的正则表达式:

另外,RegExLib.com 有一个似乎运作良好:

^((\(44\))( )?|(\(\+44\))( )?|(\+44)( )?|(44)( )?)?((0)|(\(0\)))?( )?(((1[0-9]{3})|(7[1-9]{1}[0-9]{2})|(20)( )?[7-8]{1})( )?([0-9]{3}[ -]?[0-9]{3})|(2[0-9]{2}( )?[0-9]{3}[ -]?[0-9]{4}))$

编辑:

这将允许移动、固定电话和特殊服务号码(999、123 等)——假设空格已被剥离:

'/^(?&gt;(?&gt;\+44|0)(?&gt;(?!7624)(?&gt;[12389]\d|5[56]|7[06])\d{8}|(?&gt;(?&gt;[58]00|1\d{2})\d{6})|(?&gt;8001111|845464\d)|7(?&gt;[45789]\d{8}|624\d{6}))|999|112|100|101|111|116|123|155|118\d{3}|(?&gt;\+44|0)(?&gt;800111|8454647))$/D'

【讨论】:

  • 您记得添加分隔符吗?例如。 / 在开头和结尾?
  • 是的,我做到了。它接受任何数字,包括“00000000000”。我不想接受'00000000000'....
  • 啊,对不起,我复制了基本验证。他们也有一个更彻底的答案,我已将其转换为我的答案。
  • 谢谢。但我想我正在使用这种模式。它似乎按我的意愿工作 - $pattern = "/^(\+44\s?7\d{3}|\(?07\d{3}\)|\(?01\d{3}\)?)\s?\d{3}\s?\d{3}$/";
  • 我知道这是超级旧的,但以防万一有人偶然发现并尝试使用它;最新编辑中的正则表达式无效,(?&gt; 的第一次出现似乎是错误的。删除它似乎可以使它起作用,但我是正则表达式的菜鸟,所以我可能会遗漏一些重要的东西。此外,3 个字符不足以编辑,否则我会自己更改此内容
【解决方案2】:

您最好使用现有的库,而不是尝试自己的验证,因为规则有些复杂并且可能会随着时间而改变。

例如,Google 的libphonenumber 中的这个PHP version

$phoneUtil = PhoneNumberUtil::getInstance();
try {
    $numberProto = $phoneUtil->parse('02012345678', 'GB');
} catch (NumberParseException $e) {
    echo $e;
}

然后您可以通过以下方式检查号码的有效性:

$phoneUtil->isValidNumber($numberProto);

此外,此库允许您检测电话号码类型(固定电话、手机、voip 等)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-12-27
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
相关资源
最近更新 更多