【问题标题】:Why does preg_match function validate all fields with a specific field argument?为什么 preg_match 函数使用特定字段参数验证所有字段?
【发布时间】:2015-08-21 13:23:26
【问题描述】:

我有一个表单,我在其中使用preg_match 函数来验证字段。我有一个通用的匹配函数。函数validateForm() 在脚本中较早地被调用,并具有适当的值。

当函数没有传递任何值时,尽管有正确匹配的信息,所有字段都会显示错误消息。 没有参数的广义函数:

    function validateForm() {

    if(preg_match()) {
        return true;
    }
    else {
        return false;
    }
} //  end function validateForm

当我只传递一个特定的正则表达式/字段对参数时,所有字段都会开始验证并在适当的时候显示错误消息(因此尽管函数中有特定于字段的参数,但基本上代码可以正常工作)。例如,当我将这个单一的正则表达式/字段参数传递给preg_match 时,所有字段都开始正确验证每个字段,而不管在这种情况下我只检查“城市”字段这一事实。 传递特定于字段的参数的示例,其中所有代码都“有效”:

    function validateForm($cityRegex, $city) {

    if(preg_match($cityRegex, $city)) {
        return true;
    }
    else {
        return false;
    }
} //  end function validateForm

有人可以向我解释一下,为什么当为特定字段传递特定参数时,该函数将适用于代码中的所有单个 preg_match 参数?该脚本正在按照我的意愿运行,我只是不明白为什么特定的参数是使它验证所有字段的原因。

如果需要,这里是所有 PHP 代码:

<?php
    $first = '';
    $last = '';
    $phone = '';
    $city = '';
    $state = ''; 
    $error_message = '';

    $firstLastRegex = '/^[a-zA-Z]{2,15}$/';
    $lastRegex = '/^[a-zA-Z]{2,15}$/';
    $phoneRegex = '/^(\(\d{3}\))(\d{3}\-)(\d{4})$/';
    $cityRegex = '/^[a-zA-Z]{3,20}$/';
    $stateRegex = '/^[a-zA-Z]{2}$/';

    $validate_first = '';
    $validate_last = '';
    $validate_phone = '';
    $validate_city = '';
    $validate_state = '';

    $phone_string = '';



    if(isset($_POST['submit'])) {

        $first = $_POST['firstName'];
        $last = $_POST['lastName'];
        $phone = $_POST['phoneNumber'];
        $city = $_POST['userCity'];
        $state = $_POST['userState']; 

        $show_form = false;

        $phone_string = str_replace(array('-', '(', ')'), '', $phone);

        $validate_first = validateForm($firstLastRegex, $first);
        $validate_last = validateForm($lastRegex, $last);
        $validate_phone = validateForm($phoneRegex, $phone);
        $validate_city = validateForm($cityRegex, $city);
        $validate_state = validateForm($stateRegex, $state);


        if($validate_first == false) {
                $show_form = true;
                $error_message .= "Please enter your FIRST name between 2 and 15 letters.<br>";
        }

        if($validate_last == false) {
            $show_form = true;
            $error_message .= "Please enter your LAST name between 2 and 15 letters.<br>";
        }

        if($validate_phone == false) {
            $show_form = true;
            $error_message .= "Please enter your phone number in (###)###-### format.<br>";
        }

        if($validate_city == false) {
            $show_form = true;
            $error_message .= "Please enter your city name between 3 and 20 letters.<br>";
        }

        if($validate_state == false) {
            $show_form = true;
            $error_message .= "Please enter your state's abbreviation (Example: CA).<br>";
        }

    } // end if isset();

    else {
        $show_form = true;
        $error_message = "";
    } // end else


    // REGEX FUNCTION

        function validateForm() {

        if(preg_match()) {
            return true;
        }
        else {
            return false;
        }
    } //  end function validateForm

?>

【问题讨论】:

  • 我不明白你的问题,我现在读了很多遍。你是在问为什么你的函数有效吗?!
  • 我刚想问同样的问题 Lol ... validateForm 函数需要输入参数 ... 并在 preg_match 函数中使用它们... 所以,该函数应该是function validateForm($reg,$str) { if(preg_match($reg,$str) ) ...我要停在那里...你为什么不只使用$validate_first = preg_match($firstLastRegex, $first); Lol?
  • @Rizier123 是的,我问为什么当我只为一个字段传递特定的正则表达式/值参数时它会验证所有字段。
  • 对不起,我还是不明白你的问题是什么。 (当你的问题真的是,为什么这段代码有效时,很简单,因为你必须为你想要验证的文件指定 preg_match 中使用的正则表达式)
  • 你必须对你的函数进行原型化,并且 preg_match() 来接受参数。没有什么可以阻止你在函数内(但在 preg_match 之前)插入代码以在传递空字符串时返回 false在。

标签: php regex function


【解决方案1】:

你仍然需要为你的函数提供参数。下面的代码将使您的验证功能正常工作。

    function validateForm($regEx, $field) {
    if(preg_match($regEx, $field)) {
        return true;
    }
    else {
        return false;
    }
} //  end function validateForm

我还看到了其他潜在问题,即在使用它们之前不检查是否设置了 post 变量,并且您正在为所有 if/else 情况设置 $show_form = true。我相信您可以通过一些调试语句来解决其他所有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多