我想用php验证这个表单。我想使用正则表达式和strlen()函数。 这是表格===>
<form class="form" action="index.php" method="post" name="form">
<p class="form_field">
<label>Name :</label>
<input class="input" type="text" name="name" placeholder="Name">
* <?php echo $nameErr; ?><br>
</p>
<p class="form_field">
<label>Email :</label>
<input class="input" type="text" name="email" placeholder="Email">
* <?php echo $emailErr; ?><br>
</p>
<p class="form_field">
<label>Gender :</label>
<input class="radio" type="radio" name="gender"> male
<input class="radio" type="radio" name="gender"> female
* <?php echo $genderErr; ?><br>
</p>
<p class="form_field">
<label>Website :</label>
<input type="text" name="website" placeholder="Website">
<?php echo $websiteErr; ?> <br>
</p>
<p class="form_field">
<label>Comment :</label>
<textarea rows="5" cols="30" name="comment" placeholder="your comment ..."></textarea>
* <?php echo $commentErr; ?> <br>
</p>
<input class="submit" type="submit" name="submit" placeholder="Submit" >
这是我的php函数验证它==&gt;
function validate_forms($user_input, string $field){
$input_length = strlen($user_input);
if($field = "name"){
if($input_length > 8){
$message = "the name should be less than 32 characters";
} else{
if( !preg_match("/^[A-Za-z. ]*$/", $user_input) ){
$message = "Only letters and white space are allowed ";
} else {
$get_input = $user_input;
}
}
} elseif ($field = "URL") {
if(!preg_match("/(?:https?:\/\/)?(?:[a-zA-Z0-9.-]+?\.(?:[a-zA-Z])|\d+\.\d+\.\d+\.\d+)/", $_POST['website'])){
$message = "Please enter a valid url ";
} else {
$get_input = $user_input;
}
} elseif ($field = "email") {
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$emailErr = "Invalid email format";
} else {
$get_input = $user_input;
}
}
return $message;}
我想要完成的是让我的函数在没有条件的情况下返回$ message变量,并且如果满足所有条件则获取并返回$ user_input。
我认为有可能返回一个数组,但我不知道如何。
此外,我认为我并不尊重这里的最佳做法,因此您可以帮助了解验证表单的最佳方式(更快更安全的方式)
这是出于学习目的,所以欢迎任何更多的信息或书籍,教程和课程建议。谢谢你提前
PS:我知道在这种情况下面向对象的方法会更好,但我想首先学习程序方法。答案 0 :(得分:2)
您应该仅使用preg_match
来验证名称,对于其他字段(email&amp; url),已经有办法使用php filters
define( 'NAME_MIN_LENGTH', 8 );
define( 'NAME_MAX_LENGTH', 32 );
function validate_form( $user_input = null, $field = null , &$error_message )
{
$error_message = '';
switch ( $field ) {
case 'name':
$name_len = strlen( $user_input );
if( $name_len < NAME_MIN_LENGTH ){
$error_message = 'Name too short, minimin is '. NAME_MIN_LENGTH .' caracters';
return false;
}
if( $name_len > NAME_MAX_LENGTH ){
$error_message = 'Name too long, maximum is '. NAME_MAX_LENGTH .' caracters';
return false;
}
if( ! preg_match( '/^[a-zA-Z][a-zA-Z\. ]+[a-zA-Z]$/' , $user_input ) ){
$error_message = 'Invalid name';
return false;
}
break;
case 'url':
if( ! filter_var( $user_input, FILTER_VALIDATE_URL ) ){
$error_message = 'Invalid URL';
return false;
}
break;
case 'email':
if( ! filter_var( $user_input, FILTER_VALIDATE_EMAIL ) ){
$error_message = 'Invalid Email';
return false;
}
break;
default:
$error_message = 'Invalid field';
return false;
break;
}
return $user_input;
}
// TESTS
$valid_name = 'John Doe';
$invalid_name_1 = 'Foo';
$invalid_name_2 = 'Foooooooooooooooooooooooooooooooo';
$invalid_name_3 = 'Foo#$*=+-!:;,,';
$valid_email = 'john.doe@example.com';
$invalid_email = 'foo.bar@';
$valid_url = 'http://www.example.com/';
$invlide_url = 'foo-bar';
$test_values = [
$valid_name=>'name',
$invalid_name_1=>'name',
$invalid_name_2=>'name',
$invalid_name_2=>'name',
$valid_email=>'email',
$invalid_email=>'email',
$valid_url=>'url',
$invlide_url=>'url'
];
$error_message = '';
echo '<pre>';
foreach( $test_values as $value => $field ){
if( ($valide_value = validate_form( $value, $field, $error_message )) === false ){
printf( "%33s : Is not a valid %s (%s)%s", $value, $field, $error_message, PHP_EOL );
}else{
printf( "%33s : Is a valid %s%s", $valide_value, $field, PHP_EOL );
}
}
echo '</pre>';
以上示例给出了以下输出
John Doe : Is a valid name Foo : Is not a valid name (Name too short, minimin is 8 caracters) Foooooooooooooooooooooooooooooooo : Is not a valid name (Name too long, maximum is 32 caracters) john.doe@example.com : Is a valid email foo.bar@ : Is not a valid email (Invalid Email) http://www.example.com/ : Is a valid url foo-bar : Is not a valid url (Invalid URL)
答案 1 :(得分:1)
首先,我建议您查看parsleyjs
,这是一个很棒的图书馆,可以在前端进行表格检查;这允许您在将数据发送到服务器以进行检查之前创建条件。它更实用,更易于使用。如果您有兴趣,请链接http://parsleyjs.org
您应该创建一个数组,然后以这种方式传回给用户。它将允许您检查错误或成功。
例如:
// note the "==" to check value
// single equal sign assigns value
if($field == "name"){
if($input_length > 8){
$response = array(
'is_error' => true,
'message' => "the name should be less than 32 characters"
);
} else{
if( !preg_match("/^[A-Za-z. ]*$/", $user_input) ){
$response = array(
'is_error' => true,
'message' => "Only letters and white space are allowed "
);
} else {
$get_inputp['name'] = $user_input;
$response = array(
'is_error' => false,
'message' => $user_input
);
}
}
}
//... more code here ...//
// now return the response
return $response;
然后您可以在用户端检查消息,如下所示:
$submit = validate_form('', '');
if ($submit['is_error'] === true)
{
echo $submit['message']; // and do whatever you need to in error case
}
这简化了必须尝试返回两个值,只返回包含布尔错误的数组以进行错误检查,然后是消息,您还可以在该数组中添加更多信息。
对于您的值检查,特别是对于URL
,请使用与电子邮件相同的方法。 filter_var
允许您检查网址:
$valid_url = filter_var($_POST['website'], FILTER_VALIDATE_URL);
答案 2 :(得分:0)
我建议将其转换为case语句,并按字段名称将错误存储在关联数组中,如下所示:
$errors = [];
switch($field){
case 'name':
if($input_length > 32){
$errors[$field] = "the name should be less than 32 characters";
}
break;
case 'url':
...
break;
case 'email':
...
break;
}
然后测试错误数组
if(!empty($errors)){
print_r($errors);
}