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

ここで2つの問題があります:

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

まずphoneNumber、素定数として使用しました。ただし、コードの残りの部分では、$phoneNumber名前参照として使用しました。それを変更します。(さらに良いのは、$_POST への参照キーではなく、$value を関数に渡すことです)。

第二に、文字単位で繰り返し処理しているようです{$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

私が見る2つの主なもの:

正規表現に問題があります:

'/^\(\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 に答える