PHP笔记:正则表达式验证实例
简述
正则表达式应用最多的场景是对表单提交的数据进行验证,判断是否合理,为了练习,此处用php语言实现服务器端的验证,但实际来说用js在网页客户端实现数据验证。
验证电话号码
此处验证座机号,座机号由11位(3位区位号-8位普通号码),或者12位(4位区位号-8位普通号码)号码组成。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h2>PHP正则表达式验证</h2>
<form method="post" action="">
输入值:
<input type="text" name="text" value="输入电话号码" onfocus="this.value=''"><!--聚焦对话框时,对话框显示的提示字符"输入电话号码清空"-->
<br>
<br>
<input type="submit" name="submit" value="验证">
</form>
<?php
//定义变量并且设置空值
$text="";
if($_SERVER["REQUEST_METHOD"]=="POST")
{
$text=test_input($_POST["text"]);//将名为text的表单项的内容取出,放入test_input()进行验证,符合正则表达式,返回内容本身,否则返回空字符串
if($text!=" ")
{
echo "<h3>您输入的信息如下:</h3>";
echo $text;
}
else
{
echo "您输入的信息非法!";
}
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
if(preg_match_all('/(\d{3}-)(\d{8})$|(\d{4}-)(\d{8})$/',$data,$counts))//无匹配结果返回0,返回整数几即有多少个匹配结果
{
return $data;
}
else
{
return " ";
}
}
?>
</body>
</html>
输出:
验证Email地址
Email的一般格式为:数字@域名,如aaa@qq.com。
本例通过preg_match()正则匹配函数和正则表达式验证Email地址格式是否正确,正则表达式设计的关键是@以及.号。
在前面的基础上修改一下正则表达式匹配格式
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h2>PHP正则表达式验证</h2>
<!--placeholder 属性提供可描述输入字段预期值的提示信息(hint)。该提示会在输入字段为空时显示,并会在字段获得焦点时消失。-->
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"><!--表示提交的服务器文件为本身--->
输入电子邮件地址:<br>
<input name ="text" type ="text" placeholder="aaa@qq.com" onfocus ="this.value=''" value ="">
<br>
<br>
<input type="submit" name="submit" value="验 证">
</form>
<?php
//定义变量并且设置空值
$text="";
if($_SERVER["REQUEST_METHOD"]=="POST")
{
$text=test_input($_POST["text"]);//将名为text的表单项的内容取出,放入test_input()进行验证,符合正则表达式,返回内容本身,否则返回空字符串
if($text!=" ")
{
echo "<h3>您输入的信息如下:</h3>";
echo $text;
}
else
{
echo "您输入的信息非法!";
}
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
if(preg_match_all("/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/",$data))//无匹配结果返回0,返回整数几即有多少个匹配结果
{
return $data;
}
else
{
return " ";
}
}
?>
</body>
</html>
输出:
验证IP地址
ip地址是Web用户可以访问互联网的身份凭证,每个IP地址相对于其他用户的IP地址都是独立的。
ipV4地址一般格式为xxxx.xxxx.xxxx.xxxx,由"."号将IP地址分为4部分,其中每部分的十进制取值范围为0~255,即0~255.0~255.0~255.0~255。由于正则表达式无法做数值运算,所以我们无法用数值运算的方式来筛选出0~255之间的数值范围,我们先对IP地址分组
即0~255.分组(出现3次)与0~255分组,接着按照模式进行分块设计,0~255的范围可以这样表示:
百位数 | 十位数 | 个位数 |
---|---|---|
25[0-5] | [1-9][0-9] | [0-9] |
2[0-4][0-9] | ||
1[0-9][0-9] |
<!DOCTYPE>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h2>PHP正则表达式验证</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
输入IP地址:
<input name ="text" type ="text" placeholder="nnn.nnn.nnn.nnn" onfocus ="this.value=''" value ="">
<br>
<br>
<input type="submit" name="submit" value="验 证">
</form>
<?php
//定义变量并且设置空值
$text="";
if($_SERVER["REQUEST_METHOD"]=="POST")
{
$text=test_input($_POST["text"]);//将名为text的表单项的内容取出,放入test_input()进行验证,符合正则表达式,返回内容本身,否则返回空字符串
if($text!=" ")
{
echo "<h3>您输入的信息如下:</h3>";
echo $text;
}
else
{
echo "您输入的信息非法!";
}
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
$pattern = '/^(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:2[0-4][0-9])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))$/';
if(preg_match_all($pattern,$data))//无匹配结果返回0,返回整数几即有多少个匹配结果
{
return $data;
}
else
{
return " ";
}
}
?>
</body>
</html>
输出:
代码第36行释疑:
正则表达式主要分为两部分:
- 第一部分:主要用来匹配xxxx.xxxx.xxxx.(即xxxx.{3}),每个xxxx的范围只能从“|”中选择一个子匹配串,由于小括号()定义了一个子表达式,其具有记忆功能,临时存储其匹配的字符串到缓冲区,但我们在后面不需要引用匹配的子字符串,所以用?:表示不存储到缓冲区,到数据量大的时候减轻服务器负担。
(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}
- 第二部分:主要用来匹配剩下的xxxx,理解同上
(?:(?:2[0-4][0-9])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))
统计关键字
explode()函数实现
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<style>
span{
color:red;
}
</style>
</head>
<body>
<?php
$str = "明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又恐琼楼玉宇,高处不胜寒。起舞弄清影,何似在<span>人</span>间?
转朱阁,低绮户,照无眠。不应有恨,何事长向别时圆?<span>人</span>有悲欢离合,月有阴晴圆缺,此事古难全。但愿<span>人</span>长久,千里共婵娟。";
$b = explode("人",$str);
echo "<p>";
echo $str."<br>";
echo "</p>";
echo "关键字:人<br>共出现:".(count($b)-1)."次";
?>
</body>
</html>
输出:
代码释疑:
explode(string $delimiter, string $string [, int $limit ] ) : array
此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 delimiter 作为边界点分割出来。 由于①一个分割点,返回数组有两个数组元素(分割后的两个子串),②二个分割点,返回数组有三个数组元素(分割后的三个子串),③不存在分割点,返回数组只有一个元素(即整个待分隔字符串),所以数量要减1,count()用于统计数组元素个数。
正则表达式匹配
我们也可以用正则表达式来匹配,一般而言,正则表达式函数运行效率要远远低于字符串函数
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<style>
span{
color:red;
}
</style>
</head>
<body>
<?php
$str = "明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又恐琼楼玉宇,高处不胜寒。起舞弄清影,何似在<span>人</span>间?
转朱阁,低绮户,照无眠。不应有恨,何事长向别时圆?<span>人</span>有悲欢离合,月有阴晴圆缺,此事古难全。但愿<span>人</span>长久,千里共婵娟。<span>人人人</span>";
echo "<p style ='red'>";
echo $str."<br>";
echo "</p>";
$pattern='/人/';
preg_match_all($pattern,$str,$matches);
echo "关键字:人<br>共出现:".count($matches[0])."次";
?>
</body>
</html>
输出:
检测文件上传类型
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<form method="post" action="">
<input type="file" name="text"><input type="submit" name="sub" value="上 传">
</form>
<?php
if($_POST&&$_POST["text"])
{
if(preg_match("/.jpg/",strtolower($_POST['text'])))
{
echo "上传为JPG类型图片。";
}
else if(preg_match("/.png/",strtolower($_POST['text'])))
{
echo "上传为PNG类型图片。";
}
else if(preg_match("/.gif/",strtolower($_POST['text'])))
{
echo "上传为GIF类型图片。";
}
else if(preg_match("/.rar/",strtolower($_POST['text'])))
{
echo "上传为RAR类型压缩文件。";
}
else
{
echo "没有可上传文件,或者是JPG、PNG、GIF、RAR类型之外的文件";
}
}
?>
</body>
</html>
输出:
验证邮政编码
匹配6位数字
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h2>PHP正则表达式验证</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
输入邮政编码:
<input name ="text" type ="text" placeholder="邮政编码" onfocus ="this.value=''" value ="">
<br>
<br>
<input type="submit" name="submit" value="验 证">
</form>
<?php
// 定义变量并设置为空值
$text = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$text = test_input($_POST["text"]);
if( $text != "" ){
echo "<h3>您输入的信息如下:</h3>";
echo $text;
}else{
echo "<h3>您输入的信息非法。</h3>";
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
if(preg_match("/[0-9]{6}/",$data)){
return $data;
}else{
return "";
}
}
?>
</body>
</html>