PHP正则表达式

标签: 编程语言

作者的话

正则表达式的定义可以这样简单概括:“正则表达式描述了一种字符串匹配的模式,通过这个模式在特定的函数中对字符串进行匹配查找替换分割等操作。作为一个匹配模板,是由原子、特有功能字符及模式修正符三部分组成的文字模式。”这里是我总结PHP正则表达式的定义及简单使用。

术语概念

  • 元字符:具有特殊含义的字符,如^(开始)和$(结束);
  • 原子:用来匹配的字符,如果 \d(匹配0到9);

定界符

除了字母、数字和反斜线‘\’以外的任何字符都可以作为定界符,如 #、!等都是可以作为定界符,但是行业习惯这样做:/正则表达式/。

元字符

元字符 含义
* 0次1次或多次
+ 1次或多次
0次或1次
. 除了除了换行外的其他字符
| 或选择
{n} 正好n次
{n,} 不少于n次
{n,m} 区间,>=n,<=m
^或\A 正则的开始
$或\Z 正则的结束
\b 单词的边界
\B 单词边界以外
[] 其中任意一个
[^] 除了[]中的以外
() 作为一个整体

原子

一些特殊符号,如:* ’ ” + \等,需要使用 \ 来进行转义。

原子字符 含义 举例
\cx 匹配由x指明的控制字符 如 \cM匹配一个回车符,x的值必须为A~Z或a~z之一,否则将c视为匹配‘c’
\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个指标符 在不使用表格的情况下在垂直方向按列对齐文本
\v 匹配一个垂直制表符
\d 0到9任意一个数字 等价于[0-9]
\D 除0到9之外的字符 等价于[^0-9]
\s 空白字符 等价于[\f\n\r\t\v]
\S 除了空白字符
\w 数字、字母或下划线 [0-9a-zA-Z]
\W 除了数字、字符或下划线 可以理解为特殊字符,如*、$等

示例:匹配139开头的手机号码

    $str = '13912345678';
    $pattern = '/^139\d{8}$/';
    $res_int = preg_match($pattern, $str, $matches);
    if ($res_int) {
        var_dump($matches);
    } else {
        var_dump('无法匹配');
    }

模式修正符

在最后一个细线‘/’之后使用,如 /php/i

模式修正符 含义
i 不区分大小写
m 将字符视为多行
s 将字符串视为单行,换行符作为普通的字符
x 忽略空白
U 取消贪婪模式,等同于在数量符之后添加一个问号,比如 .*?

后向引用

使用()时,会将其相关的匹配存储到一个临时的缓存区,缓存区编号从1-99,使用 \1(“\1”)来获取缓存区内容,可以使用 ?: 或 ?= 或 ?! 来忽略相关的缓存内容。
/(windows)(linxu)\2/ 这样是使用第二个缓存区的内容,linux;
/(?:windows)(linux)\1/,忽略了第一缓存区的内容,linux。

贪婪模式

概念不好解释,直接上代码去理解

    $str = '发财123发财发财456发财发财abc发财';
    $pattern = '/发财.*发财/'; // 匹配始末发财中的内容
    $pattern2 = '/发财.*?发财/'; // 匹配所有发财中的内容
    $pattern3 = '/发财.*发财/U'; // 效果等同上一行
    preg_match_all($pattern, $str, $matches);
    preg_match_all($pattern2, $str, $matches2);
    preg_match_all($pattern3, $str, $matches3);
    var_dump($matches); 
    var_dump($matches2); 
    var_dump($matches3); 

结果是这样的
这里写图片描述

中文匹配

这个不常用到,知道要点即可。
- UTF-8汉字编码范围是:0x4e00–0x9fa5,使用 u 模式修正符使字符串被当成UTF-8。
- gb2312汉字编码范围是:0xb0–0xf7,0xa1–0xfe,使用 chr 将其转为字符串。

常用函数

preg_match
preg_match_all

preg_match返回0或者1,它在完成第一次匹配后停止搜索;preg_match_all会一直匹配目标到结束;如果如果发生错误preg_match()返回 FALSE

preg_replace
preg_split

使用命名子组

有多个匹配条件,获取其中的某个条件下的匹配结果。

$str = 'foobar: 2008';

preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);

/* 下面例子在php 5.2.2(pcre 7.0)或更新版本下工作, 然而, 为了后向兼容, 上面的方式是推荐写法. */
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

var_dump($matches);

输出结果:
这里写图片描述

或者不使用 ?P name 这样的语法:

$str = 'foobar: 2008';
preg_match('/(\w+): (\d+)/', $str, $matches2);
// 这样会把结果直接保存到内容中
var_dump($matches2);

输出结果:
这里写图片描述

版权声明:本文为wmw1464228354原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wmw1464228354/article/details/81276715

智能推荐

【机器学习基础】线性回归

                                                        &nbs...

08-Vue实现书籍购物车案例

书籍购物车案例 index.html main.js style.css 1.内容讲解 写一个table和thead,tbody中每一个tr都用来遍历data变量中的books列表。 结果如下: 在thead中加上购买数量和操作,并在对应的tbody中加入对应的按钮。结果如下: 为每个+和-按钮添加事件,将index作为参数传入,并判断当数量为1时,按钮-不可点击。 结果如下: 为每个移除按钮添加...

堆排序

堆排序就是利用堆进行排序的方法,基本思想是,将代排序列构造成一个大根堆,此时整个序列的最大值就是堆顶的根节点。将它与堆数组的末尾元素交换,此时末尾元素就是最大值,移除末尾元素,然后将剩余n-1个元素重新构造成一个大根堆,堆顶元素为次大元素,再次与末尾元素交换,再移除,如此反复进行,便得到一个有序序列。 (大根堆为每一个父节点都大于两个子节点的堆) 上面思想的实现还要解决两个问题: 1.如何由一个无...

基础知识(变量类型和计算)

一、值类型 常见的有:number、string、Boolean、undefined、Symbol 二、引用类型 常用的有:object、Array、null(指针指向为空)、function 两者的区别: 值类型暂用空间小,所以存放在栈中,赋值时互不干扰,所以b还是100 引用类型暂用空间大,所以存放在堆中,赋值的时候b是引用了和a一样的内存地址,所以a改变了b也跟着改变,b和a相等 如图: 值...

猜你喜欢

Codeforces 1342 C. Yet Another Counting Problem(找规律)

题意: [l,r][l,r][l,r] 范围内多少个数满足 (x%b)%a!=(x%a)%b(x \% b) \% a != (x \% a) \% b(x%b)%a!=(x%a)%b。 一般这种题没什么思路就打表找一下规律。 7 8 9 10 11 12 13 14 15 16 17 18 19 20 28 29 30 31 32 33 34 35 36 37 38 39 40 41 49 50...

[笔记]飞浆PaddlePaddle-百度架构师手把手带你零基础实践深度学习-21日学习打卡(Day 3)

[笔记]飞浆PaddlePaddle-百度架构师手把手带你零基础实践深度学习-21日学习打卡(Day 3) (Credit: https://gitee.com/paddlepaddle/Paddle/raw/develop/doc/imgs/logo.png) MNIST数据集 MNIST数据集可以认为是学习机器学习的“hello world”。最早出现在1998年LeC...

哈希数据结构和代码实现

主要结构体: 实现插入、删除、查找、扩容、冲突解决等接口,用于理解哈希这种数据结构 完整代码参见github: https://github.com/jinxiang1224/cpp/tree/master/DataStruct_Algorithm/hash...

解决Ubuntu中解压zip文件(提取到此处)中文乱码问题

在Ubuntu系统下,解压zip文件时,使用右键--提取到此处,得到的文件内部文件名中文出现乱码。 导致此问题出现的原因一般为未下载相应的字体。 解决方案: 在终端中使用unar命令。 需要注意的是系统需要包含unar命令,如果没有,采用如下的方式解决: 实例效果展示: 直接提取到此处: 使用 unar filename.zip得到的文件...

centos7安装mysql8.0.20单机版详细教程

mysql8.0之后与5.7存在着很大的差异,这些差异不仅仅表现在功能和性能上,还表现在基础操作和设置上。这给一些熟悉mysql5.7的小伙伴带来了很多困扰,下面我们就来详细介绍下8.0的安装和配置过程。 mysql在linux上的多种安装方式: 1.yum安装 由于centos默认的yum源中没有mysql,所以我们要使用yum安装mysql就必须自己指定mysql的yum源。在官网下载mysq...