欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-06 17:44:31
...

简述

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

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

验证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>

输出:

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

验证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>

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

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

输出:

PHP笔记:正则表达式验证实例
代码释疑:

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>

输出:

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

检测文件上传类型

<!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>

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

验证邮政编码

匹配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>