PHP:如何验证英国固定电话和移动电话号码


PHP: How to validate UK landline and mobile numbers?

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

            # @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}$/";

在验证和格式化GB电话号码的正则表达式中有一个用于验证电话号码的正则表达式选择:

或者,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等)——假设空格已被删除:

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

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

例如,这个PHP版本的Google libphonenumber:
$phoneUtil = PhoneNumberUtil::getInstance();
try {
    $numberProto = $phoneUtil->parse('02012345678', 'GB');
} catch (NumberParseException $e) {
    echo $e;
}

则可以使用以下命令检查号码的有效性:

$phoneUtil->isValidNumber($numberProto);

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