PHP 정규식의 비캡처 그룹
괄호 ()는 두 가지 기능을 수행합니다 -
문자 그룹화와 캡처 그룹 기능입니다.
그런데 그룹화는 필요하지만 캡처는 하고 싶지 않다면 어떻게 해야 할까요?
이러한 문제를 해결하기 위해 특별한
비캡처 그룹 (?: )이 만들어졌습니다.
이것은 그룹화는 하지만 캡처하지 않습니다.
예시
다음 예시에서 첫 번째 괄호는 그룹화를 위해 필요하고, 두 번째 괄호는 캡처를 위해 필요합니다. 그러나 두 괄호 모두 데이터를 캡처합니다:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
결과적으로 우리의 캡처 그룹에는 다음과 같은 데이터가 담기게 됩니다:
<?php
var_dump($res[0]); // 'abab123' 출력
var_dump($res[1]); // 'ab' 출력
var_dump($res[2]); // '123' 출력
?>
예시
첫 번째 괄호 쌍이 그룹화만 하고 캡처하지 않도록 만들어 봅시다:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
결과적으로 첫 번째 캡처 그룹에는 우리의 숫자가 담기게 됩니다:
<?php
var_dump($res[1]); // '123' 출력
?>
실습 문제
임의의 수의 $@ 쌍으로 두 부분으로 나뉜
부분 문자열이 주어집니다:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
각각의 이러한 부분 문자열을 찾고, 발견된 각 부분 문자열에 대해 구분자 앞에 있는 것을 첫 번째 캡처 그룹에, 구분자 뒤에 있는 것을 두 번째 캡처 그룹에 넣으세요.