在前面发布的“Web表单与会话技术_用户注册”基础上,进行表单格式验证。
1、创建表单数据格式验证函数库文件(check_form.php)
<?php
//验证用户名(2-10位,只支持汉字、英文字母、数字、下划线)
/*
* preg_match()正则表达式匹配函数
“/^....../$”表示要匹配的字符串必须按照指定规则开始和结束
“/....../u”用于匹配多字节字符
“\w”用于匹配一个英文字母、数字或下划线
“{2,10}”用于限定匹配的字符在2-10个范围内
“\x{4e00}-\x{9fa5}”用于匹配字符编码在0x4E00-0x9FA5连续区域的汉字
*/
function checkUsername($username){
if(!preg_match('/^[\w\x{4e00}-\x{9fa5}]{2,10}$/u',$username)){
return '用户名格式不符合要求!用户名2-10位,只支持汉字、英文字母、数字、下划线。';
}
return true;
}
//验证密码(6-16位,只支持英文字母、数字、下划线)
function checkPassword($password){
if(!preg_match('/^\w{6,16}$/',$password)){
return '密码格式不符合要求!密码6-16位,只支持英文字母、数字、下划线。';
}
return true;
}
//验证邮箱(不超过40位)
/*
一个完整的邮箱地址由“用户名”、“@符号”、“服务器域名”3部分组成,用户名可以使用英文字母和数字,服务器域名要符合域名的规则。
“[a-z0-9]”用于匹配一个英文字母或数字字符,“[a-z0-9]+”表示匹配一次或多次。
“([a-z0-9]+\.)+”用于循环匹配符合“[a-z0-9]+”并且以“.”结束的字符串。(由于“.”是正则表达式中的符号,所以使用“\.”进行转义。)
“[a-z]{2,4}”用于匹配域名后缀,即com、cn、net等。
*/
function checkEmail($email){
if(strlen($email)>40){
return '邮箱长度不合法!';
}elseif(!preg_match('/^[a-z0-9]+@([a-z0-9]+\.)+[a-z]{2,4}$/i',$email)){
return '邮箱格式不符合要求!';
}
return true;
}
2、在register.php页面,调用表单数据格式验证函数库文件,对用户输入的注册信息进行验证。
<?php
header('Content-Type:text/html; charset=utf-8');
require '../chapter3/public_function.php';
require './check_form.php';
//连接数据库,设置字符集,选择数据库
dbInt();
//接收表单数据
$username=$_POST['username'];
$email=$_POST['email'];
$password=$_POST['password'];
//过滤用户输入数据
$username=safeHandle($username);
$email=safeHandle($email);
//通过POST发送的数据会保持在$_POST数组中。
//将接收到的表单数据($username,$email,$password)赋给数组$ata
$data=array();
$data=$_POST;//username,email,password
//为每个字段定义不同的验证函数
$checkdata=array(
//表单字段名=》验证函数名
'username'=>'checkUsername',
'email'=>'checkEmail',
'password'=>'checkPassword',
);
//$error数组保存验证后的错误信息
$error=array();
//循环验证每个字段,保存错误信息
foreach($checkdata as $k=>$v){
//运用可变函数,实现不同字段调用不同函数
$result=$v($data[$k]);
if($result!==true){//$result不为true(1)说明该字段值格式验证失败
$error[]=$result;//保存错误信息
}
}
//如果$error为空,说明表单数据格式正确。
if(empty($error)){
//表单验证成功
//判断用户名是否已经存在
$sql="select `id` from `user` where `username`='$username'";
$res=query($sql);
$res=mysql_fetch_row($res);
if(!empty($res)){
//用户名已存在,不允许注册,停止运行程序
//die('用户名已存在,请更换用户名。');
echo "<script> alert('用户名已存在,请更换用户名。');location.href='./register.html'</script>";
}else{
//用户名不存在,可以注册。
$password=md5($password);//使用MD5增强密码安全性
//拼接插入数据的SQL语句
$sql="insert into `user` (`username`,`password`,`email`) values ('$username','$password','$email')";
$res=query($sql);
echo "<script> alert('您已成功注册!')</script>";
}
}else{
//弹出错误信息警告,重新进行注册。
foreach($error as $v){
echo "<script> alert('$v');location.href='./register.html'</script>";
}
}
3、知识点
(1)一些函数
trim(); 去除字符串左右两端的空白字符,包括空格、换行和制表符等。
intval(); 将字符串转换为整型;
strip_tags(); 去除字符中的“<>”标签,标签内的内容也会被去除。
htmlspecialchars(); 将字符串中的HTML特殊字符转换为HTML实体字符。(例echo htmlspecialchars('<b>测试</b>');)//输出结果:<b>测试</b>
(2)数据验证
QQ号码验证:
一个正确的QQ号码,应该以1-9的数字开头,从第2位开始是0-9的任意数字,QQ号码长度至少为5位数。
实现QQ验证的正则表达式为:/^[1-9][0-9][4,19]$/
“^[1-9]”表示以1-9的数字开头,“[0-9][4,19]”表示4-19个任意的十进制数字,“$”表示字符串结尾。因此该正则表达式可以匹配5-20位的QQ号码。
手机号码验证:
中国内地的手机号码由11位数字组成,必须以1开头,第2位数字只能是3、5、8,后9位则由0-9之间的数字组成。
实现手机号码验证的正则表达式为:/^1[358]\d{9}$/
“\d”匹配任意的十进制数字,相当于[0-9]。
URL地址验证:
URL地址是按照一定格式组成的字符串,通常以协议名“http://”开头,后面跟着域名和文件路径。
实现URL地址验证的正则表达式为:/^http:\/\/[a-z\d-]+(\.[\w\/]+)+$/i
“^http:\/\/”匹配以“http://”开头的字符串,斜线“/”需要使用反斜线“\”进行转义。“[a-z\d-]+”匹配英文字母、数字、中横线“-”,一次或多次。
“[\w\/]+”匹配英文字母、数字、下划线、斜线“/”,一次或多次。“(\.[\w\/]+)+”用于循环匹配符合“\.[\w\/]+”规则的字符串。