PHP正则表达式之捕获组与非捕获组_php实例
今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中出现的问题。
什么是捕获组
捕获组语法:
字符 |
描述 |
示例 |
(pattern) |
匹配pattern并捕获结果,自动设置组号。 |
(abc)+d 匹配abcd或者abcabcd |
(?name>pattern) 或 (?'name'pattern) |
匹配pattern并捕获结果,设置name为组名。 |
|
\num |
对捕获组的反向引用。其中 num 是一个正整数。 |
(\w)(\w)\2\1 匹配abba |
\k name > 或 \k' name ' |
对命名捕获组的反向引用。其中 name 是捕获组名。 |
(? 匹配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);
结果如下:
array (size=4)
0 => string 'a=4b=98c=56' (length=11)
1 => string '4' (length=1)
2 => string '98' (length=2)
3 => string '56' (length=2)
现在我们知道了什么是捕获组,捕获组是正则表达示中以()括起来的部分,每一对()是一个捕获组。
PHP会为它编号,从1开始。至于为什么会从1开始,那是因为PHP把匹配到的完整字符串编号为0。
如果有多个括号或嵌套括号,按左边括号出现的顺序来进行编号,如图:
按图中的匹配模式匹配时,捕获组的123号分别是红绿蓝。
捕获组的忽略与命名
我们还可以阻止PHP为匹配组的编号:在匹配组中模式前加 ?:
$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)
当然,我们也可以在括号的内部为它给它独特的名字。
命名子组可以接受(?
例如:$mode = '/a=(\d+)b=(?P
使用时结果为:
array (size=5) 0 => string 'a=4b=98c=56' (length=11) 1 => string '4' (length=1) 'sec' => string '98' (length=2) 2 => string '98' (length=2) 3 => string '56' (length=2)
在保留索引数组的同时,加上一个关联项,key值为捕获组名。
捕获组的反向引用
我们在用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)。
非捕获组的用法:
非捕获组语法:
字符 |
描述 |
示例 |
(?:pattern) |
匹配pattern,但不捕获匹配结果。 |
'industr(?:y|ies) 匹配'industry'或'industries'。 |
(?=pattern) |
零宽度正向预查,不捕获匹配结果。 |
'Windows (?=95|98|NT|2000)' 匹配 "Windows2000" 中的 "Windows" 不匹配 "Windows3.1" 中的 "Windows"。 |
(?!pattern) |
零宽度负向预查,不捕获匹配结果。 |
'Windows (?!95|98|NT|2000)' 匹配 "Windows3.1" 中的 "Windows" 不匹配 "Windows2000" 中的 "Windows"。 |
(?<=pattern) |
零宽度正向回查,不捕获匹配结果。 |
'2000 (?<=Office|Word|Excel)' 匹配 " Office2000" 中的 "2000" 不匹配 "Windows2000" 中的 "2000"。 |
(?pattern) |
零宽度负向回查,不捕获匹配结果。 |
'2000 (? 匹配 " Windows2000" 中的 "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的字符串,这里就不再举例了。
如果您觉得本博文对您有帮助,您可以推荐或关注我,如果您有什么问题,可以在下方留言讨论,谢谢。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Laravel은 직관적 인 플래시 방법을 사용하여 임시 세션 데이터 처리를 단순화합니다. 응용 프로그램에 간단한 메시지, 경고 또는 알림을 표시하는 데 적합합니다. 데이터는 기본적으로 후속 요청에만 지속됩니다. $ 요청-

이것은 Laravel 백엔드가있는 React Application을 구축하는 데있어 시리즈의 두 번째이자 마지막 부분입니다. 이 시리즈의 첫 번째 부분에서는 기본 제품 목록 응용 프로그램을 위해 Laravel을 사용하여 편안한 API를 만들었습니다. 이 튜토리얼에서는 Dev가 될 것입니다

PHP 클라이언트 URL (CURL) 확장자는 개발자를위한 강력한 도구이며 원격 서버 및 REST API와의 원활한 상호 작용을 가능하게합니다. PHP CURL은 존경받는 다중 프로모토콜 파일 전송 라이브러리 인 Libcurl을 활용하여 효율적인 execu를 용이하게합니다.

Laravel은 간결한 HTTP 응답 시뮬레이션 구문을 제공하여 HTTP 상호 작용 테스트를 단순화합니다. 이 접근법은 테스트 시뮬레이션을보다 직관적으로 만들면서 코드 중복성을 크게 줄입니다. 기본 구현은 다양한 응답 유형 단축키를 제공합니다. Illuminate \ support \ Facades \ http를 사용하십시오. http :: 가짜 ([ 'google.com'=> 'Hello World', 'github.com'=> [ 'foo'=> 'bar'], 'forge.laravel.com'=>

고객의 가장 긴급한 문제에 실시간 인스턴트 솔루션을 제공하고 싶습니까? 라이브 채팅을 통해 고객과 실시간 대화를 나누고 문제를 즉시 해결할 수 있습니다. 그것은 당신이 당신의 관습에 더 빠른 서비스를 제공 할 수 있도록합니다.

이 기사에서는 Laravel 웹 프레임 워크에서 알림 시스템을 탐색 할 것입니다. Laravel의 알림 시스템을 사용하면 다른 채널을 통해 사용자에게 알림을 보낼 수 있습니다. 오늘은 알림을 보낼 수있는 방법에 대해 논의합니다

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

PHP 로깅은 웹 애플리케이션을 모니터링하고 디버깅하고 중요한 이벤트, 오류 및 런타임 동작을 캡처하는 데 필수적입니다. 시스템 성능에 대한 귀중한 통찰력을 제공하고 문제를 식별하며 더 빠른 문제 해결을 지원합니다.
