2012-06-11 90 views
3

我正在寻找一些方法来验证PHP中的电话号码,这些电话号码可以以任何存在的各种格式输入。如果有帮助,我可以将问题的域名限制为美国的电话号码(或国际号码 - 一个或另一个,但不能同时为两个)。PHP:电话号码解析

我试过寻找自定义过滤器filter_var(),相当于strtotime()的电话号码,或只是普通的香草解析库,但没有多少运气。

如果需要,我可以设计定制的解决方案,但我不希望如果已经存在,是因为A)我的肯定不会是那样强劲,和B)我不喜欢重新发明轮子。

+5

使用正则表达式 – Quantastical

回答

1

使用正则表达式,以下内容将匹配3334445555,333.444.5555,333-444-5555,3334444555,(333)4445555及其所有组合。 然后替换所有那些(333)444-5555

preg_replace('\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})', '(\1) \2-\3', $text); 
+0

我还应该指出,如果您不确定数字是否有效并且想返回错误(如果上述返回false),则可以将上述内容放在if语句中。 – Exupery

0

“解析”的电话号码是不是一个原生PHP的事情。

您需要指定自己什么是'有效'的电话号码簿 - 这应该通过验证对指定格式或正则表达式的输入来完成。

PHP无法知道'有效数字'是什么。

+0

关于日期/时间也可以这么说,但尽管在国内和国际上有不同的可能格式的数量可笑,但是“strtotime()”和等价物本身就存在。它使用“最佳猜测”解析算法,这就是我正在寻找的一切。 – FtDRbwLXw6

+0

@drrcknlsn我不同意; [文档](http://php.net/manual/en/datetime.formats.php)清楚地说明了'strtotime()'认为有效和可分析的输入。 – Repox

+0

如果PHP能够根据一组明确定义的规则知道有效的日期/时间是什么,那么绝对没有理由不知道什么是有效的电话号码。事实上,它本身不可能是因为没有人花时间去实现它。不是因为它无法完成。这就是我所说的。 – FtDRbwLXw6

0

我不知道所有美国的电话号码格式,但我猜这是你可以扩展一个总体思路:

function validate_phone($phone) { 
    // replace everything except numbers 
    $phone = preg_replace('~[^\dx]~', '', $phone); 

    return preg_match('~^\d{11}(x\d{4})?$~', $phone); 
} 


// $phone = 12345678901; 
$phone = '1-234-567-8901x1234'; 
$valid = filter_var($phone, FILTER_CALLBACK, array(
    'options' => 'validate_phone' 
)); 

if ($valid) { 
    echo "It's valid!"; 
}; 

此代码支持或十位数字(破折号,空格,内部点)和扩展格式与x2134后缀。