3

我正在寻找某种方法来验证 PHP 中的电话号码,它可以以现有的各种格式输入。如果有帮助,我可以将问题的域限制为仅美国电话号码(或国际号码 - 一个或另一个,但不能两者兼有)。

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

如果需要,我可以设计一个定制的解决方案,但如果已经存在,我不喜欢,因为 A)我的肯定不会那么健壮,并且 B)我不喜欢重新发明轮子。

4

3 回答 3

1

使用正则表达式,以下内容将匹配 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);
于 2012-06-11T13:18:10.630 回答
0

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

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

PHP 无法知道“有效电话号码”是什么。

于 2012-06-11T13:20:00.443 回答
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!";
};

此代码支持 11 位数字(内部带有破折号、空格、点)和带有 x2134 后缀的扩展格式。

于 2012-06-11T13:26:44.710 回答