PHP 정규 캡 처 그룹 과 비 캡 처 그룹 에 대한 간단 한 설명

오늘 은 정규 일치 하 는 문제 에 부 딪 혔 습 니 다.갑자기 캡 처 그룹 이라는 개념 을 찾 았 습 니 다.매 뉴 얼 에 도 약간 넘 어 갔 습 니 다.바 이 두 는 본의 아니 게 C\#자바 에 정규 캡 처 그룹 에 대한 특수 한 용법 이 있 습 니 다.키 워드 를 검색 할 때 PHP 가 있 을 때 관련 내용 이 없 었 습 니 다.직접 해 보 았 습 니 다.현재 PHP 에서 도 가능 합 니 다.그래서 정리 해 보 겠 습 니 다.나 누 는 동시에 큰 신과 세심 한 학습자 가 내 가 이해 하 는 데 나타 난 문 제 를 찾 았 으 면 좋 겠 다.
포획 조 란 무엇 인가
우선 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)
=> string 'a=4b=98c=56' (length=11)
=> string '4' (length=1)
=> string '98' (length=2)
=> string '56' (length=2)
이제 우 리 는 캡 처 그룹 이 무엇 인지 알 게 되 었 습 니 다.캡 처 그룹 은 정규 표현 에서()로 묶 인 부분 이 고 모든 쌍()은 캡 처 그룹 입 니 다.
PHP 는 1 부터 번 호 를 매 깁 니 다.왜 1 부터 시 작 했 는 지 에 대해 서 는 PHP 가 일치 하 는 전체 문자열 번 호 를 0 으로 표시 하기 때 문 입 니 다.
괄호 나 괄호 가 여러 개 있 으 면 왼쪽 괄호 가 나타 나 는 순서에 따라 번 호 를 매 깁 니 다.그림:

그림 의 일치 패턴 에 따라 일치 할 때 포획 그룹의 123 번 호 는 각각 빨간색 과 파란색 입 니 다.
캡 처 그룹의 무시 와 이름
일치 하 는 그룹의 번호 로 PHP 를 막 을 수 있 습 니 다.일치 하 는 그룹 에 모드 를 추가 하기 전에  ?:
$mode = '/a=(\d+)b=(?:\d+)c=(\d+)/';
이렇게 하면 일치 하 는 결 과 는:

array (size=3)
=> string 'a=4b=98c=56' (length=11)
=> string '4' (length=1)
=> string '56' (length=2)
물론 괄호 내부 에서 도 독특한 이름 을 줄 수 있다.
하위 그룹 이름 을 받 아들 일 수 있 습 니 다(?), (?'name')및(?P)문법 입 니 다.이전 버 전 은(?P)문법.
예 를 들 어$mode='/a=(\d+)b=(?P\d+)c=(\d+)/';
사용 시 결 과 는:

array (size=5)
=> string 'a=4b=98c=56' (length=11)
=> string '4' (length=1)

 'sec' => string '98' (length=2)
=> string '98' (length=2)
=> string '56' (length=2)
색인 배열 을 유지 하 는 동시에 관련 항목 을 추가 합 니 다.key 값 은 캡 처 그룹 이름 입 니 다.
캡 처 그룹의 역방향 참조
우 리 는 pregreplace()함수 가 정규 교 체 를 진행 할 때,우 리 는 또 사용 할 수 있다  혹시 $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)을 나타 낸다.
비 포획 그룹의 용법:
왜 비 포획 조 라 고 부 릅 니까?그것 은 캡 처 그룹의 특성 이 있 기 때 문 입 니 다.일치 하 는 패턴()에 있 지만 일치 할 때 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 문자열 이 아니 라 는 것 을 나타 내 는데 여 기 는 더 이상 예 를 들 지 않 습 니 다.
PHP 정규 에 나 오 는 캡 처 팀 과 비 캡 처 팀 은 모두 에 게 공 유 된 내용 입 니 다.참고 해 주시 고 많은 응원 부 탁 드 리 겠 습 니 다.

좋은 웹페이지 즐겨찾기