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

朱雀 2023-06-11 10:30 146阅读 0赞

文章目录

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

简述

正则表达式应用最多的场景是对表单提交的数据进行验证,判断是否合理,为了练习,此处用php语言实现服务器端的验证,但实际来说用js在网页客户端实现数据验证。

验证电话号码

此处验证座机号,座机号由11位(3位区位号-8位普通号码),或者12位(4位区位号-8位普通号码)号码组成。

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. </head>
  6. <body>
  7. <h2>PHP正则表达式验证</h2>
  8. <form method="post" action="">
  9. 输入值:
  10. <input type="text" name="text" value="输入电话号码" onfocus="this.value=''"><!--聚焦对话框时,对话框显示的提示字符"输入电话号码清空"-->
  11. <br>
  12. <br>
  13. <input type="submit" name="submit" value="验证">
  14. </form>
  15. <?php
  16. //定义变量并且设置空值
  17. $text="";
  18. if($_SERVER["REQUEST_METHOD"]=="POST")
  19. {
  20. $text=test_input($_POST["text"]);//将名为text的表单项的内容取出,放入test_input()进行验证,符合正则表达式,返回内容本身,否则返回空字符串
  21. if($text!=" ")
  22. {
  23. echo "<h3>您输入的信息如下:</h3>";
  24. echo $text;
  25. }
  26. else
  27. {
  28. echo "您输入的信息非法!";
  29. }
  30. }
  31. function test_input($data)
  32. {
  33. $data = trim($data);
  34. $data = stripslashes($data);
  35. $data = htmlspecialchars($data);
  36. if(preg_match_all('/(\d{3}-)(\d{8})$|(\d{4}-)(\d{8})$/',$data,$counts))//无匹配结果返回0,返回整数几即有多少个匹配结果
  37. {
  38. return $data;
  39. }
  40. else
  41. {
  42. return " ";
  43. }
  44. }
  45. ?>
  46. </body>
  47. </html>

输出:
在这里插入图片描述

验证Email地址

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

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

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. </head>
  6. <body>
  7. <h2>PHP正则表达式验证</h2>
  8. <!--placeholder 属性提供可描述输入字段预期值的提示信息(hint)。该提示会在输入字段为空时显示,并会在字段获得焦点时消失。-->
  9. <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"><!--表示提交的服务器文件为本身--->
  10. 输入电子邮件地址:<br>
  11. <input name ="text" type ="text" placeholder="xxxxxx@xxx.xx" onfocus ="this.value=''" value ="">
  12. <br>
  13. <br>
  14. <input type="submit" name="submit" value="验 证">
  15. </form>
  16. <?php
  17. //定义变量并且设置空值
  18. $text="";
  19. if($_SERVER["REQUEST_METHOD"]=="POST")
  20. {
  21. $text=test_input($_POST["text"]);//将名为text的表单项的内容取出,放入test_input()进行验证,符合正则表达式,返回内容本身,否则返回空字符串
  22. if($text!=" ")
  23. {
  24. echo "<h3>您输入的信息如下:</h3>";
  25. echo $text;
  26. }
  27. else
  28. {
  29. echo "您输入的信息非法!";
  30. }
  31. }
  32. function test_input($data)
  33. {
  34. $data = trim($data);
  35. $data = stripslashes($data);
  36. $data = htmlspecialchars($data);
  37. if(preg_match_all("/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/",$data))//无匹配结果返回0,返回整数几即有多少个匹配结果
  38. {
  39. return $data;
  40. }
  41. else
  42. {
  43. return " ";
  44. }
  45. }
  46. ?>
  47. </body>
  48. </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]
  1. <!DOCTYPE>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. </head>
  6. <body>
  7. <h2>PHP正则表达式验证</h2>
  8. <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
  9. 输入IP地址:
  10. <input name ="text" type ="text" placeholder="nnn.nnn.nnn.nnn" onfocus ="this.value=''" value ="">
  11. <br>
  12. <br>
  13. <input type="submit" name="submit" value="验 证">
  14. </form>
  15. <?php
  16. //定义变量并且设置空值
  17. $text="";
  18. if($_SERVER["REQUEST_METHOD"]=="POST")
  19. {
  20. $text=test_input($_POST["text"]);//将名为text的表单项的内容取出,放入test_input()进行验证,符合正则表达式,返回内容本身,否则返回空字符串
  21. if($text!=" ")
  22. {
  23. echo "<h3>您输入的信息如下:</h3>";
  24. echo $text;
  25. }
  26. else
  27. {
  28. echo "您输入的信息非法!";
  29. }
  30. }
  31. function test_input($data)
  32. {
  33. $data = trim($data);
  34. $data = stripslashes($data);
  35. $data = htmlspecialchars($data);
  36. $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]))$/';
  37. if(preg_match_all($pattern,$data))//无匹配结果返回0,返回整数几即有多少个匹配结果
  38. {
  39. return $data;
  40. }
  41. else
  42. {
  43. return " ";
  44. }
  45. }
  46. ?>
  47. </body>
  48. </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()函数实现

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <style>
  6. span{
  7. color:red;
  8. }
  9. </style>
  10. </head>
  11. <body>
  12. <?php
  13. $str = "明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又恐琼楼玉宇,高处不胜寒。起舞弄清影,何似在<span>人</span>间? 转朱阁,低绮户,照无眠。不应有恨,何事长向别时圆?<span>人</span>有悲欢离合,月有阴晴圆缺,此事古难全。但愿<span>人</span>长久,千里共婵娟。";
  14. $b = explode("人",$str);
  15. echo "<p>";
  16. echo $str."<br>";
  17. echo "</p>";
  18. echo "关键字:人<br>共出现:".(count($b)-1)."次";
  19. ?>
  20. </body>
  21. </html>

输出:

在这里插入图片描述
代码释疑:

  1. explodestring $delimiter, string $string [, int $limit ] ) : array

此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 delimiter 作为边界点分割出来。 由于①一个分割点,返回数组有两个数组元素(分割后的两个子串),②二个分割点,返回数组有三个数组元素(分割后的三个子串),③不存在分割点,返回数组只有一个元素(即整个待分隔字符串),所以数量要减1,count()用于统计数组元素个数。

正则表达式匹配

我们也可以用正则表达式来匹配,一般而言,正则表达式函数运行效率要远远低于字符串函数

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <style>
  6. span{
  7. color:red;
  8. }
  9. </style>
  10. </head>
  11. <body>
  12. <?php
  13. $str = "明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又恐琼楼玉宇,高处不胜寒。起舞弄清影,何似在<span>人</span>间? 转朱阁,低绮户,照无眠。不应有恨,何事长向别时圆?<span>人</span>有悲欢离合,月有阴晴圆缺,此事古难全。但愿<span>人</span>长久,千里共婵娟。<span>人人人</span>";
  14. echo "<p style ='red'>";
  15. echo $str."<br>";
  16. echo "</p>";
  17. $pattern='/人/';
  18. preg_match_all($pattern,$str,$matches);
  19. echo "关键字:人<br>共出现:".count($matches[0])."次";
  20. ?>
  21. </body>
  22. </html>

输出:

在这里插入图片描述

检测文件上传类型

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. </head>
  6. <body>
  7. <form method="post" action="">
  8. <input type="file" name="text"><input type="submit" name="sub" value="上 传">
  9. </form>
  10. <?php
  11. if($_POST&&$_POST["text"])
  12. {
  13. if(preg_match("/.jpg/",strtolower($_POST['text'])))
  14. {
  15. echo "上传为JPG类型图片。";
  16. }
  17. else if(preg_match("/.png/",strtolower($_POST['text'])))
  18. {
  19. echo "上传为PNG类型图片。";
  20. }
  21. else if(preg_match("/.gif/",strtolower($_POST['text'])))
  22. {
  23. echo "上传为GIF类型图片。";
  24. }
  25. else if(preg_match("/.rar/",strtolower($_POST['text'])))
  26. {
  27. echo "上传为RAR类型压缩文件。";
  28. }
  29. else
  30. {
  31. echo "没有可上传文件,或者是JPG、PNG、GIF、RAR类型之外的文件";
  32. }
  33. }
  34. ?>
  35. </body>
  36. </html>

输出:
在这里插入图片描述

验证邮政编码

匹配6位数字

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. </head>
  6. <body>
  7. <h2>PHP正则表达式验证</h2>
  8. <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
  9. 输入邮政编码:
  10. <input name ="text" type ="text" placeholder="邮政编码" onfocus ="this.value=''" value ="">
  11. <br>
  12. <br>
  13. <input type="submit" name="submit" value="验 证">
  14. </form>
  15. <?php
  16. // 定义变量并设置为空值
  17. $text = "";
  18. if ($_SERVER["REQUEST_METHOD"] == "POST") {
  19. $text = test_input($_POST["text"]);
  20. if( $text != "" ){
  21. echo "<h3>您输入的信息如下:</h3>";
  22. echo $text;
  23. }else{
  24. echo "<h3>您输入的信息非法。</h3>";
  25. }
  26. }
  27. function test_input($data) {
  28. $data = trim($data);
  29. $data = stripslashes($data);
  30. $data = htmlspecialchars($data);
  31. if(preg_match("/[0-9]{6}/",$data)){
  32. return $data;
  33. }else{
  34. return "";
  35. }
  36. }
  37. ?>
  38. </body>
  39. </html>

发表评论

表情:
评论列表 (有 0 条评论,146人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PHP表达式

        简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到正则表达式的痕迹,例如:Perl或PHP脚本语言。此

    相关 PHP 表达式

    ![2012031215322046.png][] 定位 我们什么时候使用正则表达式呢?不是所有的字符操作都用正则就好了,php在某些方面用正则反而影响效率。当我们遇到 复

    相关 php表达式实例

    php正则表达式实例 1。判断字符串是否为空,非空时检测输入字符串是否为汉字、平假名、片假名或全角数字 ![None.gif][] if  ( empty (

    相关 php 表达式

    常规: ^ 必须匹配字符串开头,$必须匹配结尾 i 忽略大小写 . 句点匹配任意单个字符 \\ 匹配特殊字符中的某一个,需使用反斜杠(\\)进行转义,如 \\/\\/匹