前言

正则表达式是一套语法规则,适用于各大编程语言。本文章正则表达式匹配的演示近使用PHP语言进行匹配。其他语言只是所使用的函数不同。

简单介绍正则表达式

  • 正则表达式就是描述字符串排列模式的一种自定义语法规则
  • 如果可以使用字符串处理函数完成的任务,就不要使用正则表达式,正则的效率比较低。
  • 有一些复杂性的操作,只能用正则表达式来完成。
  • 正则表达式也称为一种模式表达式
  • 正则表达式就是通过构建具有特定规则的模式,在与输入的字符串进行比较、分割、匹配、查找和替换。

什么是正则表达式

  • 例子: '/<img\s+src=\".*?\" \/>/' 它就是正则表达式
  • 乱七八糟的一对字符堆在一起,神秘的符号,有奇特的意义。

正则表达式的用处

  • 验证用户名长度是否合法。
  • 验证邮箱规则
  • 验证手机号
  • 验证URL
  • BBS编辑器
  • QQ聊天表情
  • 新闻采集器(小偷程序)

正则表达式的特点

  • 正则表达式也是一个字符串
  • 由具有特殊意义的字符串组成的字符串。
  • 具有一定编写规则,也是一种模式。
  • 看做是一种编程语言,因为是用一些特殊的字符,按照规则编写处一个字符串,形成一种模式 —— 正则表达式。
  • 如果正则表达式不和函数一起使用,则它就是一个普通的字符串。如果将正则表达式放到某个函数中使用,才能发挥正则表达式的作用。

##: PHP中提供的两套正则表达式函数库

  • posix 扩展正则表达式,大多以ereg开头
  • perl 兼容正则表达式,大多以preg开头
  • 推荐使用perl兼容正则表达式函数库

正则表达式知识点

  • 正则表达式的模式如何编写
  • 学习正则表达式的强大处理函数

正则表达式的语法

  • 正则定界符
  • 正则表达式中的原子
  • 正则表达式的元字符(原子修饰符)
  • 正则表达式的模式修正符

正则表达式的定界符

  • 正则定界符就是用来声明正则表达式边界的符号,正则表达式时字符串类型。所以在定义正则表达式时先定义字符串类型
  • 正则表达式常用的定界符为/,实际上除了字母和赎罪以及\之外的字符都可以作为正则表达式的定界符使用。
  • 注意:一个完整的正则表达式准确的说有两个定界符。
    • 第一个是字符串类型的引号边界符
    • 第二个是正则表达式的边界符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>

<form method='post'>
<input type="text" name="str">
<input type="submit" value="提交">
</form>


</body>
</html>


<?php

$str = @$_POST['str'];


$pattern = '/ /'; // 正则表达式定界符

preg_match($pattern, $str,$match);
var_dump($match);

?>

正则表达式中的原子

  • 什么是原子?组成正则表达式中的最小单位就是原子。

  • 原子有哪些内容组成?

    • 正常的字母都是原子,所有可见字符都是原子

    • 大部分不可见字符也都是原子,比如\n,\t,\r

    • \d 表示匹配0-9之间的任意字符。[0-9]

    • \D 表示匹配除了0-9之间的任意字符。[^0-9]

    • \s 表示匹配空白字符、包括空格、\n,\r,\t中的任意一个字符

    • \S 表示匹配除了空白字符、包括数字、\n,\r,\t中的任意一个字符

    • \w 表示匹配数字、大小写字母以及下划线中的任意一个字符

    • \W 表示匹配除了数字、大小写字母以及下划线中任意一个字符

    • [] 原子列表

      • 表示在指定的字符中选取一个原子
      • [5-9] 表示匹配5,6,7,8,9中的任意一个字符,允许缩写为开始字符-结束字符,比如[a-z],[A-z]等等
    • [^ ] 排除列表

      • [^ abc] 表示除了abc之外的所有字符都可以匹配成功
    • . 匹配除\n以外的所有字符,如果想要.匹配到\n,则需要使用模式修正符s

元字符(原子修饰符)

  • + 表示前面的原子可以出现一次或者多次(否则匹配失败)。{1,}

  • ? 表示前面的原子可以出现0次或者一次{0,1}

  • * 表示前面的原子可以出现0次或者多次{0,}

  • {m,n} 表示前面的原子最少出现m次,最多出现n次

  • {m} 表示前面的原子出现指定的m次

  • {m,} 表示前面的原子最少出现m次

  • 什么是词边界(只对英文有效)

    • 可以分割一个单词的字符都是词边界,包括空格,标签符号,特殊字符,词边界在字符串开始和结束,或者每一行的结束。
    • 不可以当做词边界的就是数字、字母和_
    • \b 词边界
    • \B 非词边界
  • 字符串边界修饰符

    • ^ 表示以指定字符开头的内容

    • $ 表示以指定字符结尾的内容

    • ^字符串$表示精准匹配某个字符串,多一个少一个都算错。

    • 注意:如果要使用^$可以匹配每一行的开始和结束部分,需要使用后面学习到的模式修正符m,视为多行处理

      1
      2
      3
      4
      $str = "hello\nx1ong\n!!!!";
      $pattern = "/^x1ong$/m"; // 正则表达式

      $res = preg_match($pattern, $str,$match);
  • 选择修饰符 | 或者的意思

    1
    $pattern = '/hello|world|x1ong/'; // 正则表达式
  • 模式单元()

    • 改变优先级
    • 将多个原子视为一个原子,好处可以使用原子数量修饰符
    • 将匹配到括号内容暂时存放在内存当中
    • 如果使用()仅仅为了模拟一个原子使用原子修饰符,那么可以在括号的开始处使用?:来解除存于内存的作用,提高效率。
    • 可以将括号的内容在函数的辅助下进行反向引用操作

    正则表达式匹配url

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    </head>
    <body>

    <form method='post'>
    <input type="text" name="str">
    <input type="submit" value="提交">
    </form>

    </body>
    </html>


    <?php

    $str = @$_POST['str'];
    $pattern = '/(?:^[a-zA-Z]{3,5}:\/\/)?(?:[a-zA-Z0-9-]+\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$/'; // 正则表达式

    /*
    匹配域名:
    http://www.baidu.com
    https://www.baidu.com
    https://www.123456.com
    http://baidu.com
    www.baidu.com
    biadu.com
    ftps://www.baidu.com
    ftp://www.baidu.com
    */

    $res = preg_match($pattern, $str,$match);
    echo '匹配结果为: ' . $res;
    echo '<hr />';

    if ($res) {
    echo '<font color="green" size="5">匹配成功</font>';
    }else {
    echo '<font color="red" size="5">匹配失败</font>';
    }
    echo '<br />';
    print_r($match);

    ?>

    模式修正符

    • i 忽略大小写
    • x 忽略正则中的空白
    • s 默认情况下.可以匹配除了\n以外的任意字符,但是匹配不了\n也就是换行符,那么如果想让\n被匹配到,就需要使用s这个修正符
    • m 视为多行处理,在该模式下^$会从换行之后的字符重新匹配
    • S 加速匹配
    • U 模式(改变贪婪模式)
      • 改变贪婪模式,程序默认是贪婪匹配的,匹配最后的结束为止,我们可以在正则中使用.*?匹配任意字符的同时使用非贪婪模式。