PHP笔记:正则表达式验证实例

文章目录

  • 简述
  • 验证电话号码
  • 验证Email地址
  • 验证IP地址
  • 统计关键字
    • explode()函数实现
    • 正则表达式匹配
  • 检测文件上传类型
  • 验证邮政编码

简述

正则表达式应用最多的场景是对表单提交的数据进行验证,判断是否合理,为了练习,此处用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>

//定义变量并且设置空值
 $text="";
 if($_SERVER["REQUEST_METHOD"]=="POST")
 {
  $text=test_input($_POST["text"]);//将名为text的表单项的内容取出,放入test_input()进行验证,符合正则表达式,返回内容本身,否则返回空字符串
  if($text!=" ")
  {
   echo "

您输入的信息如下:

"
; 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>

输出:
PHP笔记:正则表达式验证实例_第1张图片

验证Email地址

Email的一般格式为:数字@域名,如[email protected]
本例通过preg_match()正则匹配函数和正则表达式验证Email地址格式是否正确,正则表达式设计的关键是@以及.号。

在前面的基础上修改一下正则表达式匹配格式

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h2>PHP正则表达式验证</h2>
<!--placeholder 属性提供可描述输入字段预期值的提示信息(hint)。该提示会在输入字段为空时显示,并会在字段获得焦点时消失。-->
<form method="post" action="$_SERVER["PHP_SELF"]);?>"><!--表示提交的服务器文件为本身--->
    输入电子邮件地址:<br>
    <input name ="text" type ="text" placeholder="[email protected]"   onfocus ="this.value=''" value ="">
    <br>
    <br>
    <input type="submit" name="submit" value="验 证">
</form>

//定义变量并且设置空值
 $text="";
 if($_SERVER["REQUEST_METHOD"]=="POST")
 {
  $text=test_input($_POST["text"]);//将名为text的表单项的内容取出,放入test_input()进行验证,符合正则表达式,返回内容本身,否则返回空字符串
  if($text!=" ")
  {
   echo "

您输入的信息如下:

"
; 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>

输出:

PHP笔记:正则表达式验证实例_第2张图片

验证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="$_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>

//定义变量并且设置空值
 $text="";
 if($_SERVER["REQUEST_METHOD"]=="POST")
 {
  $text=test_input($_POST["text"]);//将名为text的表单项的内容取出,放入test_input()进行验证,符合正则表达式,返回内容本身,否则返回空字符串
  if($text!=" ")
  {
   echo "

您输入的信息如下:

"
; 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>

输出:
PHP笔记:正则表达式验证实例_第3张图片

代码第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>

 $str = "明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又恐琼楼玉宇,高处不胜寒。起舞弄清影,何似在间?
转朱阁,低绮户,照无眠。不应有恨,何事长向别时圆?有悲欢离合,月有阴晴圆缺,此事古难全。但愿长久,千里共婵娟。";
 $b = explode("人",$str);
 echo "

"; echo $str."
"
; echo "

"
; echo "关键字:人
共出现:"
.(count($b)-1)."次"; ?> </body> </html>

输出:

PHP笔记:正则表达式验证实例_第4张图片
代码释疑:

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>

 $str = "明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又恐琼楼玉宇,高处不胜寒。起舞弄清影,何似在间?
转朱阁,低绮户,照无眠。不应有恨,何事长向别时圆?有悲欢离合,月有阴晴圆缺,此事古难全。但愿长久,千里共婵娟。人人人";
 echo "

"; echo $str."
"
; echo "

"
; $pattern='/人/'; preg_match_all($pattern,$str,$matches); echo "关键字:人
共出现:"
.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>

 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="$_SERVER["PHP_SELF"]);?>">
    输入邮政编码:
    <input name ="text" type ="text" placeholder="邮政编码"   onfocus ="this.value=''" value ="">
    <br>
    <br>
    <input type="submit" name="submit" value="验 证">
</form>

// 定义变量并设置为空值
$text = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
 $text = test_input($_POST["text"]);
 if( $text != "" ){
  echo "

您输入的信息如下:

"
; echo $text; }else{ echo "

您输入的信息非法。

"
; } } 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>

你可能感兴趣的:(PHP)