PHP正则表达式教程:从基础到高级,掌握字符串处理技巧

在PHP中,正则表达式是描述字符排列模式的自定义语法规则。他们具有非常完整的语法系统,可以编写模式,提供灵活而直观的弦乐处理方法。正则表达式描述了字符串匹配模式,该模式可用于检查字符串是否包含某个子字符串,替换匹配的子字符串或取出符合特定条件的子字符串,等待。

PHP正则表达式教程:从基础到高级,掌握字符串处理技巧

本教程的操作环境:Windows 7系统,PHP8版本,Dell G3计算机

也许您以前听说过正则表达式,总体上的印象是很难学习,非常复杂,并且有一种不可思议的感觉。实际上,正则表达并不是那么神秘。它们是描述字符布置模式的自定义语法规则。

什么是正则表达式

正则表达式(也称为模式表达式)具有非常完整的语法系统,可以编写模式,提供灵活而直观的字符串处理方法。正则表达式用于特定功能,以实现字符串匹配,搜索,替换和分割操作,例如字符串匹配,搜索和替换。

例如,如果要在计算机的某个目录中搜索所有TXT格式文件,则可以在该目录中输入 *.txt,然后按Enter列出目录中的所有TXT。 TXT格式文件。这里使用的 *.txt可以理解为简单的正则表达式。

以下两个示例是使用正则表达式的语法构建的,如下所示:

/http(s)?:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is      // 匹配网址 URL 的正则表达式
/^\w{3,}@([a-z]{2,7}|[0-9]{3})\.(com|cn)$/                    // 匹配邮箱地址的正则表达式

在上面的示例中,不要被看似乱码的字符串所吓到。它们是根据正则表达式的语法规则构建的。它们是由具有特殊功能的普通字符和字符组成的字符串。并且有必要在特定的正则表达功能中使用这些字符串来达到效果。

使用正则表达式

正则表达式描述了字符串匹配模式,该模式可用于检查字符串是否包含某个子字符串,替换匹配的子字符串或取出符合特定条件的子字符串,等待。例如,当用户提交表单时,显然不足以确定输入的电话号码,电子邮件地址等是否有效。

正则表达式是由正常字符(例如字符a至z)和特殊字符(称为“ metacharacters'”组成的字面模式。正则表达式是将字符模式与搜索字符串匹配的模板。正则表达式的模式可以成为一个字符,一组字符,一系列字符,字符之间的选择或所有这些组件的任何组合。

使用正则表达式的目的是以简单的方式实现强大的功能。为了简单,有效而不会失去权力,正则表达规则很复杂,更难建立正确和有效的正则表达式,因此需要一些努力。入门后,通过某些参考和大量实践在开发实践中使用正则表达式是非常有效和有趣的。

正则表达式中的常见术语

在学习正则表达式之前,让我们首先理解正则表达式中的几个令人困惑的术语,这对学习正则表达式有很大帮助。

1)GREP

最初是ED编辑器中的命令,以在文件中显示特定内容。后来,它成为独立的工具GREP。

2)Egrep

尽管GREP不断更新和升级,但仍无法跟上技术的步伐。为此,贝尔实验室写了Egrep,意思是“扩展的Grep”。这大大提高了正则表达式的能力。

3)POSIX(UNIX的便携式操作系统接口)

便携式操作系统接口。在GREP开发的同时,其他一些开发人员还根据其偏好开发了具有独特风格的版本。但是问题也伴随着,有些程序支持某个Metacharacter,而另一些程序则没有。因此,有Posix。 POSIX是一系列标准,可确保操作系统之间的便携性。但是,POSIX与SQL一样,尚未成为最终标准,只能用作参考。

4)Perl(实际提取和报告语言)

实际提取和报告语言。 1987年,拉里·沃尔(Larry Wall)释放了佩尔(Perl)。在接下来的七年中,从Perl1到现在的Perl5,它最终成为POSIX之后的另一个标准。

5)PCRE

Perl的成功使其他开发人员在某种程度上与“ Perl”兼容,包括C/C ++,Java,Python等,都有自己的正则表达式。 1997年,菲利普·榛树(Philip Hazel)开发了PCRE库,PCRE库是一组与Perl Prinesion表达式兼容的常规发动机。其他开发人员可以将PCRE集成到自己的语言中,以为用户提供丰富的常规功能。许多软件使用PCRE,而PHP就是其中之一。

正则表达语法规则

在使用正则表达式之前,我们必须首先学习正则表达式的语法。正则表达式的组成元素通常包括普通字符,元字符,预选符,锚点,非打印字符和指定的替换术语。

1)正常字符

普通字符包括所有不明确指定为元视频者的可打印和不可打印的字符,包括所有上部和下部案例字母,数字,标点符号,标点符号和某些符号。最简单的正则表达式是用于搜索字符串的单个普通字符。例如,单个字符的正则表达式 / A /将始终与字母A匹配。

您还可以将多个单个字符组合成形成更长的表达式,例如, / /将与搜索字符串中的懒狗匹配, / /将与lazy狗匹配。无需使用任何串联操作员,只需连续输入字符即可。

2)Metacharacter

除了普通字符外,正则表达式还可以包含“元音”。金属割酸可以分为单个特定的金发杆菌和多符号的金发分子。例如,Metacharacter \ d,与数字字符匹配。

下表中列出了所有单字符的元听管体。

Metacharacter行为示例

匹配上一个字符或亚表达零或多次,相当于{0,}

ZO*匹配“ Z”和“ Zoo”

匹配先前的字符或子表达一遍或多次,相当于{1,}

ZO+匹配“ ZO”和“ Zoo”,但不匹配“ Z”

匹配上一个字符或亚表达零或一次,相当于{0,1}

匹配模式是非怪兽吗?紧随其后的是其他任何限定符(*, +,?,{n},{n,}或{n,m})。非绿色模式匹配了尽可能少的字符串,而默认的贪婪模式匹配了尽可能多的字符串

zo?匹配“ Z”和“ ZO”,但不是“动物园”

o+?在“ oooo”中仅匹配一个“ O”,而O+匹配所有“ O”

做)?匹配“做”或“做”中的“做”

匹配搜索字符串开始的位置。如果标志包含M(多行搜索)字符,则 ^也将匹配\ n或\ r之后的位置。如果您使用 ^作为括号表达式中的第一个字符,则该字符集将是成反比的

^\ d {3}在搜索字符串的开头匹配3个字符

[^abc]匹配除a,b,c以外的任何字符

匹配搜索字符串结束的位置。如果标志包含M(多行搜索)字符,则 ^还将与\ n或\ r前方的位置匹配。

\ d {3} $在搜索字符串末尾匹配3个数字

匹配除线断路\ n以外的任何单个字符。要匹配任何字符,包括\ n,请使用[\ s \ s]等模式

AC匹配“ ABC”,“ A1C”和“ AC”

[]

标记括号表达式的开始和结尾

[1-4]与“ 1”,“ 2”,“ 3”或“ 4”匹配

[^aaeeiioouu]匹配任何非宽字符

{}

标记预选符表达式的开始和结尾

{2,3}匹配“ AA”和“ AAA”

()

标记子表达的开始和结尾,您可以保存子表达以备将来使用。

A(\ d)将“ A0”与“ A9”匹配。保存此号码以备将来使用

指示两个或多个项目之间的选择

Z |食物匹配“ Z”或“食物”

(z | f)OOD匹配“ Zood”或“食物”

表示JavaScript中文本正则表达模式的开始和结尾。在第二个“/”之后添加单个字符标志可以指定搜索行为

/abc/gi是与“ ABC”匹配的JavaScript文本正则表达式。 g(global)标志指定与搜索模式的所有匹配,i(忽略案例)标志使搜索不敏感

将下一个角色标记为特殊字符,文字,反向或八分音逃生字符

\ n匹配线路断裂。 \(匹配“(”。\\匹配“ \”

当这些特殊字符出现在括号表情中并成为普通字符时,它们将失去其含义。要匹配这些特殊字符,必须首先逃脱字符,也就是说,字符是用后斜线\添加的。例如,要搜索 +文本字符,您可以使用Expression \ +。

除了上述单个字符的金属扫描剂外,还有一些多字符的金属扫描剂,如下表所示。

Metacharacter行为示例

\ b

匹配一个单词边界。也就是说,单词和空间的位置

er \ b匹配“从不”中的“ er”,但不匹配“动词”中的“ er”

\ b

非边界单词匹配

er \ b匹配“动词”中的“ er”,但在“永不”中不匹配“ er”

\ d

数字字符匹配,相当于[0-9]

在搜索字符串“ 12 345”中,\ d {2}匹配“ 12”和“ 34”。 \ d匹配“ 1”,“ 2”,“ 3”,“ 4”和“ 5”

\ d

非数字字符匹配,等效于[^0-9]

/D+匹配“ ABC123 DEF”中的“ ABC”和“ DEF”

\ w

匹配AZ,AZ,0-9和下划线中的任何任意字符,相当于[A-ZA-Z0-9]

在搜索字符串“快速棕色狐狸...”中,\ w+匹配““,”,“快速”,“棕色”和“狐狸”

\ w

匹配AZ,AZ,0-9和下划线以外的任何字符等于[^a-Za-Z0-9]

在搜索字符串“快速棕色狐狸...”中,\ w+匹配“ ...”和所有空格

[xyz]

角色集,匹配任何指定的字符

[ABC]匹配“ a”中的“平原”

[^xyz]

反向字符集,匹配任何未指定的字符

[^abc]匹配“ p”,“ 1”,“ i”和“ n”中的“ plain”

[AZ]

角色范围,匹配指定范围内的任何字符

[AZ]匹配“ A”至“ Z”范围内的任何小写字母字符

[^az]

反向字符范围,匹配任何不在指定范围内的字符

[^az]匹配不在“ A”到“ Z”范围内的任何字符

{n}

只需匹配n,n是一个非负整数

o {2}在“鲍勃”中不匹配“ o”,而是与“ fooood”中的两个“ o”匹配

{n,}

匹配至少n次,n是一个非负整数

*等于{0,}

+等于{1,}

o {2}在“鲍勃”中不匹配“ o”,而是与“ fooood”中的所有“ o”匹配

{N,M}

匹配至少n次,最多M次。 n和m是非阴性整数,n在哪里?等于{0,1}

在搜索字符串“ 1234567”中,\ d {1,3}匹配“ 123”,“ 456”和“ 7”

(模型)

匹配模式并保存比赛。可以从JavaScript中的Exec方法返回的数组元素中检索保存的匹配。要匹配括号字符(),请使用“ \(”或“ \)”

(章节|部分)[1-9]匹配“第5章”,并保存“章节”供将来使用

(?:模型)

与模式匹配,但不能保存比赛,也就是说,该匹配将不会存储以供将来使用。这对于将模式组件与“或”字符(|)相结合很有用。

行业(?:y | ees)等于行业|工具

(?=模式)

预测是第一个。找到比赛后,将在匹配文本之前搜索下一个匹配。比赛将无法保存以供将来使用

^(?= _。*\ d。{4,8} $对密码应用限制:

它的长度必须在4到8个字符之间,并且必须至少包含一个数字,在哪种模式下, *\ d寻找任何数量的字符,然后是一个数字。对于搜索字符串“ ABC3QR”,它与“ ABC3”匹配。

{4,8}从(不在之后)开始之前(不在之后)匹配包含4〜8个字符的字符串和“ ABC3QR”。

^和$指定搜索字符串的开始和结束位置,当搜索字符串包含匹配字符以外的任何字符时,这将阻止匹配。

(?!模型)

负面的预测是第一。匹配与模式不匹配的搜索字符串。找到比赛后,将在匹配文本之前搜索下一个匹配。比赛将无法保存以供将来使用

\ b(?!th)/w+\ b匹配这种模式中“ th”的单词,\ b与单词边界匹配。对于搜索字符串“快速”,请匹配第一个空间。 (?!th)匹配一个非“ th”字符串,并匹配“ QU”,从该匹配开始,!W+匹配一个单词,即匹配“ Quick”

\ cx

匹配x指示的控制字符。 X的值必须在AZ或AZ范围内。如果不是这样,假设C是文本“ C”字符本身

\ cm匹配Ctrl+M或Carriage返回字符

\ xn

匹配N,其中N是十六进制的逃生代码。十六进制逃生代码必须长两位数。允许在正则表达式中使用ASCII代码

\ x41匹配“ a”,\ x41等于“ \ x04”,其次是“ 1”(因为n必须正好是两个数字)

\ num

匹配num,其中num是一个正整数。这是对保存的比赛的参考

(。)\ 1匹配两个连续的同一字符

\ n

标识八分位逃生代码或反向注册。如果\ n之前至少有n个捕获子表达,则n是反向注册。否则,如果n是八分音数(0-7),则n是八分之一的逃生代码

(\ d)\ 1匹配两个连续的相同数字

\ nm

标识八分位逃生代码或反向注册。如果\ nm至少是NM捕获子表达式,则NM为反向。如果\ nm至少在nM捕获子表达式之前,则n是反向注册,然后是文本m。如果以上情况不存在,当n和m是八分音数字(0-7)时,\ nm匹配八分位逃逸代码nm

\ 11与标签字符匹配

\ nml

当n是八分音数(0-3),M和1是八分音数(0-7),匹配八分位逃逸代码NML

\ 011与标签匹配

\联合国

匹配n,其中n是4个小数数中表示的Unicode字符

\ u00a9匹配版权符号(©找)

3)非打印字符

非打印字符由普通字符和逃脱字符组成,这些字符用于匹配正则表达式中的特定行为,例如换行符,页面断路,空间字符等。下表列出了未打印的字符。

角色匹配等同于

\ f

页面更换器

\ x0c和\ cl

\ n

线路断裂

\ x0a和\ cj

\ r

马车返回符号

\ x0d和\ cm

\ s

任何空格字符,包括空格,标签和页面断开

[\ f \ b \ r \ t \ v]

\ s

任何非Whitespace字符

[^\ f \ b \ r \ t \ v]

\ t

标签字符

\ x09和\ ci

\ v

垂直选项卡符号

\ x0b和\ ck

4)优先顺序

使用正则表达式时,您需要注意比赛的顺序。通常,从左到右计算相同的优先级,并且优先级不同的操作首先高,然后较低。如下表所示,各种操作员的匹配顺序是优先级。

顺序Metacharacter描述

逃生符号

(),(?:),(?=),[]

支架和支架

*, +,{n},{n,},{n,m}

预选赛

^,$,\ \任何Metacharacter

定位点和序列

代替

此外,角色比替换操作员的优先级更高,例如,“ M | Food”可以匹配“ M”或“食物”。

代替

替换在正则表达式中允许在两个或多个替换选项之间进行选择。实际上,可以在模式中指定两个匹配模式或关系。您可以使用管道|字符指定两个或多个替代选项之间的选择,称为“替换”。匹配管道字符两侧的最大表达式。

例如:

/Chapter|Section [1-9][0-9]{0,1}/

正则表达式与字符串“章节”或字符串“部分”匹配,然后是一个或两个数字。

如果搜索字符串为“第22节”,则表达式匹配“第22节”。但是,如果搜索字符串为“第22章”,则表达式匹配单词“章节”,而不是“第22章”。

为了解决这种表达形式的可能的误导,可以使用括号来限制替换范围,即,以确保仅将其应用于两个单词“章节”和“部分”。正则表达式可以通过将括号添加到“第1章”或“第3节”中匹配。将上述表达式更改为以下形式:

/(Chapter|Section) [1-9][0-9]{0,1}/

修改后,如果搜索字符串为“第22节”,则表达式匹配“第22节”。如果搜索字符串为“第22章”,则表达式匹配单词也将是“第22章”。

子表达

将括号放在正则表达式中会产生子表达,从而使搜索文本中的匹配模式和拆分匹配中的匹配模式分为多个单独的subbsatches,并且程序可以检索生成的submatches。

例如,与电子邮件帐户相匹配的正则表达式:

/(\w+)@(\w+)\.(\w+)/

该正则表达式包含3个子表达式,并且将3个子表达式分别匹配并保留了匹配结果,并且与其他表达式的匹配结果整体显示。

以下示例将通用资源指标(URI)分解为其组成部分:

/(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/

如果我们使用此正则表达式匹配字符串“:80/脚本/default.htm”,则三个子表达的匹配结果是http,msdn.microsoft.com:80,and/scripting/default.htm。

反向

回传用于查找重复的字符组。此外,反向引用可用于重新排列输入字符串中各个元素的顺序和位置,以重置输入字符串的格式。

可以从正则表达式中引用子表达并替换字符串。每个子表达均由一个数字识别,称为反向注册。

在正则表达式中,每场保存的儿童比赛都是按照从左到右出现的顺序存储的。用于存储子匹配的缓冲区数从1开始,最多可以存储99个子表达。在正则表达式中,可以使用\ n访问每个缓冲区,其中n标识一个或两个小数点的特定缓冲区。

反向注册的一种应用是提供能够在文本中找到两个相同单词的匹配的能力。以下句子是示例:

Is is the cost of of gasoline going up up?

这句话包含多个重复的单词。如果您可以设计一种方法来定位句子而无需查找每个单词的重复,那将是有用的。

以下正则表达式使用单个子表达来实现这一点:

/\b([a-z]+) \1\b/

在这种情况下,子表达是括号中包含的所有内容。该子表达包括[AZ]+指定的一个或多个字母顺序的字符。正则表达式的第二部分是对先前保存的sibsatch的引用,即单词的第二个匹配与括号表达式完全匹配。 \ 1用于指定第一个subsatch。 \ b单词边界元素字符确保仅检测到单个单词。否则,此表达式将无法正确识别诸如“发行”或“ this Is”之类的短语。因此,匹配字符串的结果“是汽油上升的成本吗?” IS是,使用expression /\ b([az]+)\ 1 \ b /。

在PHP中使用正则表达式

PHP有两组正则表达处理操作,由功能库支持:

两组函数库的功能相似,但是PCRE的执行效率高于POSIX的功能,因此我们仅介绍PCRE函数库。

推荐学习:“ PHP视频教程”

PHP免费学习视频:立即学习

踏上前端学习旅程,并踏上通往精通的道路!从前端基础知识到项目实践操作,我们将逐步逐步进行并达到峰值!

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

55阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

46阅读

php一句话木马,一句话木马ctf

2026年10月05日

49阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

51阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

49阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

44阅读