PHP表单学习之怎样验证表单中的邮件和URL?
在之前的文章中给大家带来了《PHP表单学习之怎样验证表单中的必需字段?》,其中详细的介绍了PHP中怎样验证表单中的必需字段的相关知识,本篇文章我们继续来看一下,怎样验证表单中的邮件和URL。希望对大家有帮助!

在上一篇文章中我们已经了解到了怎样去验证必填的信息也就是必须字段,我们需要知道在我们填写信息时,虽然有些数据不是必填的,但是这些信息是有格式要求的,比如手机号码或者网址等等,这样的信息不能够随便填写。这时候我们要怎样才能完成对这种信息的验证呢?
这时候我们就要通过正则表达式来进行对表单中的右键和URL信息进行验证了。如果对正则表达式不太清楚的话可以点击《正则表达式视频教程》进行学习。下面就简单的给大家介绍一下我们在验证表单数据时会用到的正则表达式的一些知识。
正则表达式
正则表达式是一种描述一段文本规则的方法,它不是精确的匹配,而是通过一些特定的符号来模糊匹配。在PHP中,我们使用preg_match函数来执行正则表达式的匹配,一个参数是我们的正则表达式规则,第二个参数是需要检查的文本。
preg_match函数的语法格式如下:
preg_match ( string $正则 , string $字符串 [, array &$结果] )
其中我们需要注意到的是:根据$正则变量,匹配$字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0。^表示开始;$表示结束。
接下来我们通过示例来看一下正则表达式的应用:
<?php
header("Content-type:text/html;charset=utf-8"); //设置编码
$str = 'date20150121';
if (preg_match('/^date/', $str)) {
echo '匹配成功';
} else {
echo '匹配失败';
}
?>
以上示例中就是在匹配以date 开始的编号。输出结果:

接下来我们看一下preg_matchede第三个参数是匹配的内容,通常我们会将一个空的数组传递进去,因为是传址调用,匹配结束后,数组中会得到具体匹配的内容。
我们还是通过一个示例来看一下,示例如下:
<?php
header("Content-type:text/html;charset=utf-8"); //设置编码
$str = 'date20150121';
if (preg_match('/^date/', $str,$mat)) {
print_r($mat);
} else {
echo '匹配失败';
}
?>
输出结果:

在正则表达式中字母使用w、而数字使用d(D表示非数字)来表示
+ 表示一个或者多个,* 表示0个或者多个,? 表示有或者没有,{n} 表示具体几位,{m, n} 表示大于m个,小于n个。
示例如下:
<?php
header("Content-type:text/html;charset=utf-8"); //设置编码
$name = "zhang"; // wang zhu hu ma tan
if (preg_match('/an|hu/', $name, $arr)) {
print_r($arr);
} else {
echo '匹配失败';
}
?>
输出结果:

使用或条件可以用来匹配字符串,如果仅仅是单个的字母或者字符,则可以使用范围表示,使用[]可以表示一个字符的取值范围'/[a0.]/' 可以匹配包含了a或者0或者.的任意字符串。
另外,正则表达式还可以使用-来表示一组范围,[a-z] 表示小写的26个字母中的任意一个,[A-Z] 表示一个大写字母,[0-9] 表示一位十进制数。
正则表达式了解这么多,接下来我们就要来验证表单的格式是否正确了。
PHP验证名称、邮件和URL
名字的验证规则是必须的,并且只能包含字母和空格。E-mail的验证规则是必须的,其中必须是一个有效的电子邮件地址(包含'@'和'.')。网址的验证规则的是可选的,并且如果存在,它必须包含一个有效的URL。备注的验证规则是可选的,多行输入字段。性别的验证规则是必须的,必须选择一个。
那接下来我们可以通过上述中的政策表达式来写出以下代码,将通过简单的方式来检测 name 字段是否包含字母和空格,如果 name 字段值不合法,将输出错误信息,示例如下:
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z]*$/",$name)) {
$nameErr = "只允许字母和空格";
}
通过上述代码便能够提示用户姓名填写的格式,接下来我们可以根据同样的方法来验证邮件和URL。
邮箱名可以是字母、数字、下划线和点组成的任意字符;邮箱要包含@符号,后面的文字按域名规则处理,以下代码将通过简单的方式来检测 e-mail 地址是否合法。如果 e-mail 地址不合法,将输出错误信息,示例如下:
$email = test_input($_POST["email"]);
if (!preg_match("/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/",$email)) {
$emailErr = "无效的 email 格式!";
}
以下代码将检测URL地址是否合法 (以下正则表达式运行URL中含有破折号:"-"), 如果 URL 地址不合法,将输出错误信息,示例如下:
$website = test_input($_POST["website"]);
if (!preg_match("/(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%
=~_|]/i",$website)) {
$websiteErr = "无效的 URL";
}
将上述的验证方法添加到整体的格式中,示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PHP中文网</title>
</head>
<style>
.error {color: #FF0000;}
</style>
<body>
<?php
// 定义变量并设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "姓名是必填的";
} else {
$name = test_input($_POST["name"]);
// 检查姓名是否包含字母和空白字符
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "只允许字母和空格";
}
}
if (empty($_POST["email"])) {
$emailErr = "电邮是必填的";
} else {
$email = test_input($_POST["email"]);
// 检查电子邮件地址语法是否有效
if (!preg_match("/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/",$email)) {
$emailErr = "无效的 email 格式";
}
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
// 检查 URL 地址语法是否有效(正则表达式也允许 URL 中的斜杠)
if (!preg_match("/(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i",$website)) {
$websiteErr = "无效的 URL";
}
}
if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"])) {
$genderErr = "性别是必选的";
} else {
$gender = test_input($_POST["gender"]);
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>PHP 验证实例</h2>
<p><span class="error">* 必需的字段</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
姓名:<input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
邮箱:<input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
网址:<input type="text" name="website">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
评论:<textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
性别:
<input type="radio" name="gender" value="female">女性
<input type="radio" name="gender" value="male">男性
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="提交">
</form>
<?php
echo "<h2>您的输入:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>
通过上述代码,当我们没有按照我们设置的规则填写的话,输出结果如下:

当然作为扩展知识,也可以使用弹窗,只需要在上述示例中的代码做些改动,将输出的字符变成弹窗的格式,示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PHP中文网</title>
</head>
<style>
.error {color: #FF0000;}
</style>
<body>
<?php
// 定义变量并设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "<script language="javascript">
{
alert("姓名是必填的"); //弹出对话框
}
</script>";
} else {
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "<script language="javascript">
{
alert("姓名只允许字母和空格"); //弹出对话框
}
</script>";
}
}
if (empty($_POST["email"])) {
$emailErr = "<script language="javascript">
{
alert("电邮是必填的"); //弹出对话框
}
</script>";
} else {
$email = test_input($_POST["email"]);
// 检查电子邮件地址语法是否有效
if (!preg_match("/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/",$email)) {
$emailErr = "<script language="javascript">
{
alert("无效email的格式"); //弹出对话框
}
</script>";
}
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
// 检查 URL 地址语法是否有效(正则表达式也允许 URL 中的斜杠)
if (!preg_match("/(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i",$website)) {
$websiteErr = "<script language="javascript">
{
alert("无效的URL"); //弹出对话框
}
</script>";
}
}
if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"])) {
$genderErr = "<script language="javascript">
{
alert("性别是必选的"); //弹出对话框
}
</script>";
} else {
$gender = test_input($_POST["gender"]);
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>PHP 验证实例</h2>
<p><span class="error">* 必需的字段</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
姓名:<input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
邮箱:<input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
网址:<input type="text" name="website">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
评论:<textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
性别:
<input type="radio" name="gender" value="female">女性
<input type="radio" name="gender" value="male">男性
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="提交">
</form>
<?php
echo "<h2>您的输入:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>
当填写内容不按规定规则是,点击提交,输出结果如下:



如此我们便完成了PHP验证名称、邮件和URL。
大家如果感兴趣的话,可以点击《PHP视频教程》进行更多关于PHP知识的学习。

