如何验证“(344)004-1585”类型的电话号码

时间:2012-11-28 22:29:29

标签: php phone-number

我用jQuery掩盖了电话号码“(342)004-1452”。现在我正在尝试使用PHP验证此输入。我试过了

if(!preg_match('\(?[2-9][0-8][0-9]\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}', $_POST['tel']))
{
    $errors['tel']='enter a valid phone number';
}

但我认为我的preg_match表达式无效。什么是正确的preg_match表达式来验证这些数据?

3 个答案:

答案 0 :(得分:2)

你们都在考虑它。您真正需要做的就是验证给定的字符串是否包含正确数量的数字字符。

$input = '(342) 004-1452';
$stripped = preg_replace('/[^0-9]/', '', $input);

if( strlen($stripped) != 10 ) {
    printf('%s is not a valid phone number.', $input);
} else {
    printf('%s is a valid phone number. yay.', $input);
}

//output: (342) 004-1452 is a valid phone number. yay.

你可以从任何有人用它输入的乱码输入中恢复电话号码:

$phone_pretty = sprintf('(%s) %s-%s',
    substr($stripped,0,3),
    substr($stripped,3,3),
    substr($stripped,6,4)
    );

答案 1 :(得分:1)

您的正则表达式缺少分隔符。用/包裹它:

'/\(?[2-9][0-8][0-9]\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}/'

如果您已将环境配置为显示警告,则应该看到一个:

  

PHP警告:preg_match():分隔符不能是字母数字或反斜杠

如果您没有打开警告,或者故意将其关闭,则应该停止开发PHP代码,直到重新打开它们为止。

答案 2 :(得分:1)

您的表达式看起来没问题,但preg_match()需要您为引号内的正则表达式的开头和结尾提供分隔符。

这些标记通常是斜杠,但实际上可以是许多其他字符。

因此,在您的代码行中添加斜杠会产生以下结果:

if(!preg_match('/\(?[2-9][0-8][0-9]\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}/', $_POST['tel']))

如果您希望字符串只是一个电话号码而不是其他内容,您可能还希望通过在开头添加^并在结尾添加$来限制正则表达式:

if(!preg_match('/^\(?[2-9][0-8][0-9]\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/', $_POST['tel']))

希望有所帮助。

(也就是说,我想补充一点,你所检查的电话号码格式仅适用于美国和美国拨号计划的国家;大多数国际国家使用不同的格式,所以如果你想接受国际访客,你会需要比这更宽松的正则表达式)