2010-11-06 183 views
1

我正在开发一项功能来验证用户提交的美国电话号码,该号码可以用人们通常使用的任何常用数字格式提交。到目前为止我的代码如下:正在验证美国电话号码w /地区代码

$number = '123-456-7890'; 

function validate_telephone_number($number) { 
    $formats = array(
     '###-###-####', 
     '(###)###-###', 
     '(###) ###-###', 
     '##########' 
    ); 

    $number = trim(preg_replace('[0-9]', '#', $number)); 

    if (in_array($number, $formats)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

首先,这段代码似乎并不奏效,并返回上所有提交的数字错误。我似乎无法找到我的错误。其次,我正在寻找一种简单的方法,只允许来自特定允许区号的数组中的电话号码。有任何想法吗?

回答

1

关于第一个问题:

preg_replace('/[0-9]/', '#', $number) 

'/\d/'


对于第二个问题,这可能会帮助您:

$areaCode = substr(preg_replace('/[^\d]/', '', $number),0 , 3); 

这将使你在第3位丢弃所有其他字符的数字。

我不熟悉美国的区号格式,所以我无法帮助您更多地了解这一点。


奖励:

if (in_array($number, $formats)) { 
    return true; 
} else { 
    return false; 
} 

相当于

return in_array($number, $formats); 

作为事实上的形式

if(<expression>){ 
    return true; 
} 
else{ 
    return false; 
} 

的任何语句可以写为return (bool) <expr>;,但在这种情况下,in_array将始终返回布尔值,因此不需要(bool)

+0

真棒。完美运作。谢谢! – thenameisnick 2010-11-06 17:34:49

+0

这两部分工作很好!感谢您的提示。 – thenameisnick 2010-11-06 17:48:27

0

您的代码不检查格式正确但无效的数字 - 例如,在美国没有区号以0或1开头,因此可以检查。另外,您的格式不允许包含国家代码 - 例如,+15551234567将被拒绝。

如果你不关心格式,只是想验证如果输入量有效的美国电话号码的数字,你可以使用这样的事情:

$clean_number = preg_replace("/[^0-9]/", '', $number); 
$valid = preg_match("/^(\+?1)?[2-9][0-9]{9}$/", $clean_number); 

当然,这也会接受“foo 5555555555 bar”作为有效数字 - 如果您不希望这样做,请使preg_replace更具限制性(例如仅删除括号,空格和破折号)。

0

如果你喜欢做,而无需保持大量的代码,你的看看这个API是验证一个美国号码,并提供了多种格式的数字https://www.mashape.com/parsify/format

+0

链接中断,请你更新链接 – 2017-11-11 07:58:09