我正在寻找某种方法来验证 PHP 中的电话号码,它可以以现有的各种格式输入。如果有帮助,我可以将问题的域限制为仅美国电话号码(或国际号码 - 一个或另一个,但不能两者兼有)。
我已经尝试寻找自定义过滤器filter_var()
,相当于strtotime()
电话号码,或者只是普通的香草解析库,但没有太多运气。
如果需要,我可以设计一个定制的解决方案,但如果已经存在,我不喜欢,因为 A)我的肯定不会那么健壮,并且 B)我不喜欢重新发明轮子。
我正在寻找某种方法来验证 PHP 中的电话号码,它可以以现有的各种格式输入。如果有帮助,我可以将问题的域限制为仅美国电话号码(或国际号码 - 一个或另一个,但不能两者兼有)。
我已经尝试寻找自定义过滤器filter_var()
,相当于strtotime()
电话号码,或者只是普通的香草解析库,但没有太多运气。
如果需要,我可以设计一个定制的解决方案,但如果已经存在,我不喜欢,因为 A)我的肯定不会那么健壮,并且 B)我不喜欢重新发明轮子。
使用正则表达式,以下内容将匹配 3334445555、333.444.5555、333-444-5555、333 444 5555、(333) 444 5555 及其所有组合。然后用 (333) 444-5555 替换所有这些
preg_replace('\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})', '(\1) \2-\3', $text);
“解析”电话号码不是原生 PHP 要做的事情。
您需要自己指定什么是“有效”电话号码 - 这应该通过根据指定格式或正则表达式验证输入来完成。
PHP 无法知道“有效电话号码”是什么。
我不知道所有美国电话号码格式,但我猜这是您可以扩展的一般想法:
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!";
};
此代码支持 11 位数字(内部带有破折号、空格、点)和带有 x2134 后缀的扩展格式。