Php 您将如何改进此表单验证代码?

Php 您将如何改进此表单验证代码?,php,regex,Php,Regex,我需要验证一个表单。这是一些服务器端验证,检查必填字段是否已填写,电子邮件是否有效,数字和字母数字字段是否不包含恶意字符 我想要一些关于如何改进代码以使其更可靠和简洁的反馈 <?php // current state $valid = true; // post data collection $name = "John Doe"; $email = "user@gmail.com"; $age = "19"; // select data that needs va

我需要验证一个表单。这是一些服务器端验证,检查必填字段是否已填写,电子邮件是否有效,数字和字母数字字段是否不包含恶意字符

我想要一些关于如何改进代码以使其更可靠和简洁的反馈

<?php

// current state
$valid  = true;

// post data collection
$name   = "John Doe";
$email  = "user@gmail.com";
$age    = "19";

// select data that needs validation
$required   = array($name, $email);
$validEmail     = array($email);
$validNumber    = array($age);
$validAlpha     = array($name);

// check required fields
for ($i=0; $i<count($required); $i++) {
    if (strlen($required[$i]) == 0) {
        echo "Please fill out all required fields";
        $valid = false;
        break;
    }
}

// check for valid email field
for ($i=0; $i<count($validEmail); $i++) {
    if (preg_match('/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/', $validEmail[$i])) {

    } else {
        echo '"' . $validEmail[$i] . '"' . ' is an invalid email address <br />';
        $valid = false;
    }
}

// check numeric fields
for ($i=0; $i<count($validNumber); $i++) {
    if (preg_match('/^[0-9 ]+$/', $validNumber[$i])) {

    } else {
        echo '"' . $validNumber[$i] . '"' . ' is an invalid number <br />';
        $valid = false;
    }
}

// check alpha
for ($i=0; $i<count($validAlpha); $i++) {
    if (preg_match('/^[a-zA-Z ]+$/', $validAlpha[$i])) {

    } else {
        echo '"' . $validAlpha[$i] . '"' . ' contains invalid characters. This field only accepts letters. <br />';
        $valid = false;
    }
}

// return "Your form was successfully sent"
if ($valid) {
    echo 'Your form was successfully sent. <br />Back to the site <form><input type="button" value="back" onclick="history.go(-1);return true;"></form>';
}

?>

要验证电子邮件(和一些其他字段),您可以(必须?)使用而不是regex,例如:

filter_var('bob@example.com', FILTER_VALIDATE_EMAIL)
将返回真值


以下是用于验证的过滤器列表

减少重复代码通常可以通过以下方式避免:

  • 循环(学习
    foreach
    而不是手动
    计数)
  • 功能
  • 数组规则集
在您的情况下,您需要采用更好的输入变量处理,该处理保留名称,并允许进行如下筛选:

$rules = array(
    "email" => FILTER_VALIDATE_EMAIL,
    "number1" => '/^[0-9 ]+$/',
    "alpha2" => '/^[a-zA-Z ]+$/',        
);

foreach ($rules as $varname => $verify) {
    if (is_int($verify) ? !filter_var($_REQUEST[$varname], $verify)
                        : !preg_match($verify, $_REQUEST[$varname]))
    {
        echo "The field '$varname' contains invalid whatevers...";
        $valid = false;
    }
}

当然,通过从验证规则到变量名的额外间接操作,您还可以获得更好的错误消息。但这是这里的基本方法。同样,使用一些自定义函数有助于进一步提高可读性和减少代码。

使用符合标准的电子邮件正则表达式,如内置的
filter\u var($email,filter\u VALIDATE\u email)