手机版

PHP正则表达式的题注组和非捕获组

时间:2021-09-27 来源:互联网 编辑:宝哥软件园 浏览:

今天遇到常规匹配的问题,突然转到了“捕获组”的概念,手册也有点通过了。百度无意中求助于C#和Java中常规抓取组的特殊用法,搜索关键词在PHP中时没有相关内容。我自己尝试过,发现在PHP中也是可行的,所以总结一下,在分享的同时,也希望大神和细心的学习者能发现我理解中的问题。

什么是捕获组?

捕获组语法:

性格;角色;字母

形容

例子

(模式)

匹配模式并捕获结果,并自动设置组号。

(abc) d

匹配abcd或abcd。

(?名称模式)

或者

(?名称模式)

匹配模式并捕获结果,并将名称设置为组名。

\ n数量

反向引用捕获组。其中num是正整数。

(\w)(\w)\2\1

匹配abba

\kname

或者

\k'name '

对命名捕获组的反向引用。其中name是捕获组名称。

(?组\ w)ABC \ g组

匹配xabcx

先来看看PHP的正则匹配函数。

int preg _ match的前两项(string $pattern,string $ subject [,array $ matches [,int $ flags=0 [,int $ offset=0]]是常用的,$pattern是常规匹配模式,$string是要匹配的字符串。

Array $match是一个数组,表示匹配结果将被写入$match。

Int $flags如果传递了此标志,则在每次返回匹配项时,将追加一个字符串偏移量(相对于目标字符串的偏移量)。

Int $offset用于指定从未知目标字符串中搜索(以字节为单位)。

让我们主要看看$match的价值会是什么:

$ mode='/a=(\ d)b=(\ d)c=(\ d)/';$ str=' * * a=4b=98c=56 * *$res=preg_match($mode,$str,$ match);var _ dump($ match);结果如下:

数组(大小=4) 0=字符串“a=4b=98c=56”(长度=11) 1=字符串“4”(长度=1) 2=字符串“98”(长度=2) 3=字符串“56”(长度=2)

现在我们知道捕获组是什么了。捕获组是正则表达式图中由()包围的部分,每对()就是一个捕获组。

PHP会给它编号,从1开始。至于为什么从1开始,是因为PHP将匹配的完整字符串编号为0。

如果有多个括号或嵌套括号,请按照左侧括号出现的顺序对它们进行编号,如图所示:

按照图中的匹配模式匹配时,捕捉组的123号为红、绿、蓝。

忽略并命名捕获组。

我们还可以通过添加?

$mode='/a=(\d )b=(? \ d)c=(\ d)/';这样,匹配结果将变成:

array(size=3)0=string ' a=4b=98c=56 '(length=11)1=string ' 4 '(length=1)2=string ' 56 '(length=2)当然,我们也可以在括号内给它一个唯一的名称。

命名子组可以接受(?姓名),(?名称')和(?Pname)语法。仅接受以前的版本(?Pname)语法。

例如:$mode='/a=(\d )b=(?psec \ d)c=(\ d)/';

使用时,结果是:

数组(大小=5) 0=字符串' a=4b=98c=56 '(长度=11) 1=字符串' 4 '(长度=1)' sec'=字符串' 98 '(长度=2) 2=字符串' 98 '(长度=2) 3=字符串。

对捕获组的反向引用。

当我们使用preg_replace()函数进行常规替换时,我们也可以使用\n或$n来引用第n个捕获组。

$ mode='/a=(\ d)b=(\ d)c=(\ d)/';$ str=' * * a=4b=98c=56 * *$ RP=' \ 1/$ 2/\ 3/';echo preg_replace($mode,$rp,$ str);//**4/98/56/**\1表示捕获组1(4),$2表示捕获组2 (98),\ 3表示捕获组3(56)。

非捕获组的使用:

非捕获组语法:

性格;角色;字母

形容

例子

(?模式)

匹配模式,但不捕获匹配结果。

工业?y|ies)

匹配“行业”或“产业”。

(?=模式)

零宽度正向预览不会捕获匹配结果。

Windows(?=95|98|NT|2000)'

匹配“窗口2000”中的“窗口”。

它与“窗口3.1”中的“窗口”不匹配。

(?模式)

零宽度负预览不捕获匹配结果。

Windows(?' 95|98|NT|2000)'

匹配“窗口3.1”中的“窗口”。

它与“窗口2000”中的“窗口”不匹配。

(?=模式)

零宽度正向查找不捕获匹配结果。

'2000 (?=Office|Word|Excel)'

匹配“Office2000”中的“2000”。

它与“窗口2000”中的“2000”不匹配。

(?模式)

零宽度负回溯不捕获匹配结果。

'2000 (?Office|Word|Excel)'

匹配“窗口2000”中的“2000”。

它与“Office2000”中的“2000”不匹配。

为什么叫非捕获组?这是因为它们具有捕获组的特性,这些组在匹配模式的()中。但是,匹配时,PHP不会对它们进行分组。它们只会影响匹配结果,不会作为结果输出。

/d(?=xxx)匹配“后跟一个xxx”。

注意格式:只能放在匹配的模式字符串之后!

例如:

$pattern='/\d(?=ABC)/';$ str=' ab36abc8eg$res=preg_match($pattern,$str,$ match);var _ dump($ match);//6匹配6,因为它仅用作数字,后跟abc。

(?=xxx) /d匹配“前面有一个数字xxx”。

注意格式:只能放在匹配的模式字符串之前!

例如:

$pattern='/(?=ABC)\ d/';$ str=' ab36abc8eg$res=preg_match($pattern,$str,$ match);var _ dump($ match);//8匹配8,因为它仅用作数字,后跟abc。

还有(?=xxx()?=xxx)相对(?=xxx()?=xxx)他们添加了非运算符“!”before=。

意思是一个前面/后面没有xxx的字符串,所以这里就不举例了。

如果你觉得这篇博文对你有帮助,可以推荐或者关注我。如果你有任何问题,可以在下面留言讨论。谢谢你。

版权声明:PHP正则表达式的题注组和非捕获组是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。