前言

不知道你们有没有这个感觉,看正则表达式就像看天文数字一样,什么电话号码、邮箱的正则表达式,上网复制一下粘贴下来就搞定了。完全不知道这写的是什么玩意。后来我自己也想学一下,因为感觉用处还是挺大的。看了看视频,额...真**简单。这里的话如果想看视频学习的话我推荐一下慕课网这门鬼斧神工之正则表达式课程,上手真的太快了。好了,废话不多说,开始搞事情。

基本语法

界定符:

标识一个正则表达式的开始和结束,用'/'或'#'或'{ }',因为语法'{ }'也可能是正则表达式的运算符,为了避免混淆,所以不建议使用。建议的用法如下:

$pattern = '/[0-9]/';  //我喜欢这个,看起来比较简洁
$pattern = '#[0-9]#';

原子:

可见原子:Unicode编码表中可用键盘输出后肉眼可见的字符,例如:标点 ; . / ? 或者英文字母,汉字等等可见字符

不可见原子:Unicode编码表中可用键盘输出后肉眼不可见的字符,例如:换行符 \n,Tab制表符\t, 空格等等,

一般只用这三个(换行符一般和其他字符一起匹配,因为只有换行符是匹配不到的)

小提示:匹配运算符前面需要加 '\' 例如:'+' 号,匹配的话需要写出 '\+'

元字符

原子的筛选方式:

| 匹配两个或者多个分支选择

[] 匹配方括号中的任意一个原子

[^] 匹配除方括号中的原子之外的任意字符;

例子:Duang|duang 或者 [Dd]uang 都可以匹配到Duang和duang

区间写法:[a-z]匹配a到z的字符, [0-9]匹配0到9的字符。也可以[a-z0-9]

. 匹配除换行符之外的任意字符

\d 匹配任意一个十进制数字,即{0-9]

\D 匹配任意一个非十进制数字[^0-9] 相当于[^\d]

\s 匹配一个不可见的原子,即[\f\n\r\t\v]

\S 匹配一个可见的原子,即[\f\n\r\t\v],相当于[\s]z

\w 匹配任意一个数字、字母或下划线,即[0-9a-zA-Z_]

\W 匹配任意一个非数字、字母或下划线,[0-9a-zA-Z_],相当于[\w]

量词

{n} 表示其前面的原子刚好出现了n次。

[n] 表示其前面的原子最少出现n次

{n,m} 最少出现n次,最多出现m次

* 匹配0次、一次或者多次,即{0,}

+ 匹配一次或多次,即{1,}

? 匹配0或1次,即{0,1}

边界控制

^ 匹配字符串开始的位置

$ 匹配字符串结尾的位置

例:^John 可以匹配到:John 但是匹配不到:123John,因为规定了字符串以John开头

模式单元

() 匹配其中的整体为一个原子, 如: (X|x)iaomi , 可以匹配到 xiaomi

修正模式

贪婪匹配

匹配结果存在歧义时取其长(默认)

懒惰匹配

匹配结果存在歧义时取其短,只需在正则表达式的后面'/'加上'U',例如'/[0-9]/U';

例子:

$subject = "test__123123123";
preg_match('/test.+123/', $subject, $matches); //贪婪模式
var_dump($matches);
preg_match('/test.+123/U', $subject, $matches); //懒惰模式
var_dump($matches);

常见的修正模式:

U 懒惰匹配

i 忽略英文字母的大小写

x 忽略正则表达式的空白符

s 让元字符'.' 匹配包括换行符在内的所有字符

常用函数

preg_match

执行匹配正则表达式

preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int

  • pattern: 要搜索的模式,字符串类型。
  • subject:输入字符串。
  • match: 如果提供了参数matches,它将被填充为搜索结果,数据结构为一维数组。
  • flags: 可以设置为PREG_OFFSET_CAPTURE,使用搜索结果的第0个元素为匹配的字符串,第1个元素为对应的偏移量(位置)
  • offset: 搜索从目标字符串的起始位置开始匹配。

返回值:匹配次数

类似函数preg_match_all,参数与preg_match一致

区别:

  • preg_match:只匹配一次,搜索结构match的数据结果为一维数组
  • preg_match_all:匹配全部,搜索结果match的数据结构为二维数组。

preg_replace

执行一个正则表达式搜索和替换,返回值为替换后的字符串

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed

  • pattern:要搜索的模式。可以是一个字符串或字符串数组。
  • replacement:用于替换的字符串或字符串数组
  • subject:要进行搜索和替换的字符串或字符串数组。
  • limit:替换的最大次数。默认是 -1(无限)。
  • count:替换次数。

    类似函数preg_filter,参数与preg_replace一致

    区别(使用数组进行匹配的时候才看得出区别):
  • preg_replace:不管是否有替换,返回全部结果
  • preg_filter:只返回匹配的结果。

preg_split

通过一个正则表达式分隔字符串

preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] ) : array

  • $pattrn:用于搜索的模式,字符串形式。
  • subject:输入字符串
  • limit:将限制分隔得到的子串最多只有limit个,返回的最后一个 子串将包含所有剩余部分。
  • flags:有以下标记的组合:

    -- 1. PREG_SPLIT_NO_EMPTY: 返回分隔后的非空部分。

    -- 2. PREG_SPLIT_DELIM_CAPTURE: 用分隔符'()'括号把匹配的捕获并返回。

    -- 3. PREG_SPLIT_OFFSET_CAPTURE: 匹配返回时将会附加字符串偏移量

PREG_SPLIT_DELIM_CAPTURE这个参数可能比较难明白,举个例子看看:

$subject = "1a23b";
$a = preg_split('/[\d]/', $subject, -1, PREG_SPLIT_NO_EMPTY);
var_dump($a);
$a = preg_split('/([\d])/', $subject, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
var_dump($a);

输出如下:

array (size=2)

0 => string 'a' (length=1)

1 => string 'b' (length=1)

array (size=5)

0 => string '1' (length=1)

1 => string 'a' (length=1)

2 => string '2' (length=1)

3 => string '3' (length=1)

4 => string 'b' (length=1)

preg_grep

返回匹配模式的数组条目

preg_grep ( string $pattern , array $input [, int $flags = 0 ] ) : array

  • $pattern:要搜索的模式,字符串形式
  • $input:输入数组
  • flags:如果不设置则返回匹配的数目,设置PREG_GREP_INVERT则返回不匹配的数目。

preg_quote

转义正则表达式字符,返回为转义后的字符串

preg_quote ( string $str [, string $delimiter = NULL ] ) : string

  • str:输入字符串
  • delimiter:需要转义的字符串

个人博客网址: https://colablog.cn/

如果我的文章帮助到您,可以关注我的微信公众号,第一时间分享文章给您

PHP正则表达式,看这一篇就够啦!的更多相关文章

  1. [转帖]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件

    nginx学习,看这一篇就够了:下载.安装.使用:正向代理.反向代理.负载均衡.常用命令和配置文件 2019-10-09 15:53:47 冯insist 阅读数 7285 文章标签: nginx学习 ...

  2. 关于 Docker 镜像的操作,看完这篇就够啦 !(下)

    紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...

  3. JVM内存模型你只要看这一篇就够了

    JVM内存模型你只要看这一篇就够了 我是一只孤傲的鱼鹰 让我们不厌其烦的从内存模型开始说起:作为一般人需要了解到的,JVM的内存区域可以被分为:线程栈,堆,静态方法区(实际上还有更多功能的区域,并且这 ...

  4. 【java编程】ServiceLoader使用看这一篇就够了

    转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...

  5. Java中的多线程=你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  6. 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了

    title author date CreateTime categories win10 uwp win2d 入门 看这一篇就够了 lindexi 2019-5-25 20:0:52 +0800 2 ...

  7. 鸿蒙应用程序Ability(能力)看这一篇就够

    本节概述 什么是Ability Ability分类 Ability生命周期 Ability之间跳转 什么是Ability Ability意为能力,是HarmonyOS应用程序提供的抽象功能.在Andr ...

  8. windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看

    windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看 1. 新建excel表格 A B C D E 姓 名 全名 登录名 密码 李 四 李四 李四 test123!@ ...

  9. 什么是 DevOps?看这一篇就够了!

    本文作者:Daniel Hu 个人主页:https://www.danielhu.cn/ 目录 一.前因 二.记忆 三.他们说-- 3.1.Atlassian 回答"什么是 DevOps?& ...

  10. python面试看这一篇就够了

    python-面试通关宝典 有面Python开发方向的,看这一个repo就够啦? 语言特性 1.谈谈对 Python 和其他语言的区别 Python属于解释型语言,当程序运行时,是一行一行的解释,并运 ...

随机推荐

  1. An Overview of Query Optimization in Relational Systems

    An Overview of Query Optimization in Relational Systems

  2. 如何获取 Greenplum 中用户最后登录时间和登录频率

    这几天搞系统迁移,老板突然想知道给客户开的那么多用户当中,哪些还在用,哪些已经不用了.我们的数据库是 Greenplum,而且还是一直没有升级的老版本,Google 了一下没有发现特别好的查看用户登录 ...

  3. centos设置固定IP方法

    首先网络模式设为桥接 [root@centos64 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0HWADDR=00:0C:2 ...

  4. Tomcat部署java项目java.lang.OutOfMemoryError异常解决方法

    java.lang.OutOfMemoryError异常解决方法 Window系统环境下,在catalina.bat文件第一行添加以下内容 set JAVA_OPTS=-Xms512m -Xmx512 ...

  5. TCP服务器端和客户端程序设计【转】

    本文转载自:http://blog.csdn.net/yueguanghaidao/article/details/7035248# 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.实验目的 ...

  6. 分享知识-快乐自己:Linux—jdk 安装步骤

    1.查看现有版本:java -version 2.查看jdk的具体版本: rpm -qa| grep jdk || rpm -qa| grep gcj 3.删除已安装jdk包: rpm -e --no ...

  7. Java_Time_01_获取当前时间

    1. Date SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// ...

  8. 监听输入框变化(oninput,onpropertychange,onchange)

    oninput,onpropertychange,onchange: oninput是onpropertychange的非IE浏览器版本,支持firefox和opera等浏览器,但有一点不同,它绑定于 ...

  9. gulp记录

    npm install gulp -g //全局安装gulp gulp -v //此处若有问题,配置环境变量,npm config get prefix得到路径 npm init //新建nodejs ...

  10. Git Shell Warning

    Warning: Permanently added 'github.com,192.30.252.120' <RSA> to the list of known hosts. The a ...