1

可能重复:
电话号码验证的综合正则表达式
PHP:美国电话号码验证

我正在尝试使用 preg_match 验证电话号码,但任何时候我输入正确格式的电话号码 (111) 111-1111,它都会返回无效字符错误而不是 true。我认为我的正则表达式没有任何问题(据我所知),所以我猜我的逻辑有问题

function validate_phone_number($phoneNumber, $requiredLength = 14)
{

       //Check to make sure the phone number format is valid 
    for ($i = 0; $i < strlen($_POST[$phoneNumber]); $i++){
            if(preg_match('/^\(\d{3}\) \d{3}-\d{4}\$/', $_POST[phoneNumber]{$i}))
            {
                return true;
            }
            else
            {
                return "<h3>" . "The phone number you entered contains invalid characters" . "</h3>";
            }

       //Check to make sure the number is the required length
            if (strlen($_POST[$phoneNumber]) > $requiredLength) {
                return "<h3>" . "The phone number you entered contains too many characters" . "</h3>";
            }
            else if (strlen($_POST[$phoneNumber]) < $requiredLength) {
                return "<h3>" . "The phone number you entered does not contain enough characters" . "</h3>";
            }
        }
        return true;
}

我用来调用函数的内容

if (count($_POST) > 0) {
    $error = array();


   $phone = validate_phone_number('phoneNumber');
        if($phone !==true) {
            $error[] = $phone;

        }


        if (count($error) == 0) {

           //Phone number validates

        }

        else { 
          echo "<h2>Error Message:</h2>";

          foreach($error as $msg) {
            echo "<p>" . $msg . "</p>";
          }
        }
      }
4

2 回答 2

1

这里有两点错误:

for ($i = 0; $i < strlen($_POST[$phoneNumber]); $i++){
        if(preg_match('/^\(\d{3}\) \d{3}-\d{4}\$/', $_POST[phoneNumber]{$i}))

首先,您将phoneNumber其用作裸常量。但是在其余代码中,您用作$phoneNumber名称参考。改变那个。(更好的是,将 $value 传递给您的函数,而不是 $_POST 的引用键)。

其次,您似乎正在逐字迭代{$i}。但是正则表达式应该应用于整个字符串。遏制for.

function validate_phone_number($phoneNumber, $requiredLength = 14)
{    
    //Check to make sure the phone number format is valid 
    if (preg_match('/^\(\d{3}\) \d{3}-\d{4}\$/', $_POST[$phoneNumber]))
    {

长度检查是完全多余的,因为正则表达式已经断言您的固定格式。

于 2012-10-28T18:55:51.240 回答
1

我看到的两个主要内容:

您的正则表达式有问题:

'/^\(\d{3}\) \d{3}-\d{4}\$/'
                        ^- wrong. leave it out:

'/^\(\d{3}\) \d{3}-\d{4}$/'

当您首先测试正则表达式时,它只会在字符串正好是 14 个字符时匹配。因此,之后不需要检查字符串长度。

您还应该考虑使用该filter_var功能,例如:

$options['options'] = array('regexp' => '/^\(\d{3}\) \d{3}-\d{4}$/');
$valid = filter_var($number, FILTER_VALIDATE_REGEXP, $options);

它还有一个filter_input能够对$_POST输入进行操作的姊妹函数。可能很方便:

$options['options'] = array('regexp' => '/^\(\d{3}\) \d{3}-\d{4}$/');
$valid = filter_input(
    INPUT_POST, 'phoneNumber', FILTER_VALIDATE_REGEXP, $options
);
于 2012-10-28T19:01:34.007 回答