1

我用 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 表达式是什么?

4

3 回答 3

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)
    );
于 2012-11-28T22:43:43.537 回答
1

您的正则表达式缺少分隔符。用/

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

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

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

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

于 2012-11-28T22:32:31.997 回答
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']))

希望有帮助。

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

于 2012-11-28T22:33:56.033 回答