PHP 정규 표현식의 명명된 캡처 그룹
preg_match를 사용하여 날짜를 일,
월, 연도로 분해하고자 한다고 가정해봅시다. 이를 위해
캡처 그룹을 사용하겠습니다:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // ['2025-10-29', '2025', '10', '29']을 출력합니다
?>
보시다시피, 결과는 배열로 얻어지며, 첫 번째(인덱스 0) 요소에는 전체 날짜가, 두 번째(인덱스 1)에는 연도가, 세 번째(인덱스 2)에는 월이, 네 번째(인덱스 3)에는 일이 들어갑니다.
그러나 때로는 캡처 그룹의 내용을 연관 배열로 얻는 것이 편리할 때가 있습니다. 즉, 이 경우 다음과 같은 배열을 얻는 것이 좋을 것입니다:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
이를 위해 정규 표현식에는 특별한
문법이 존재합니다. 바로 이 문법입니다: (?<name>pattern),
여기서 pattern는 정규 표현식 패턴이고, name
는 캡처 그룹의 이름입니다.
날짜에 대한 우리의 정규 표현식을 명명된 캡처 그룹을 사용하여 다시 작성해 보겠습니다:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
결과는 캡처 그룹의 이름이 키가 되고, 캡처된 내용이 값이 되는 연관 배열이 됩니다:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
사실 결과 배열에서 캡처 그룹의 값들은
이름과 순차적인 번호 모두로 접근할 수 있습니다.
즉, 예를 들어
연도는 키 'year'와
번호 1로 접근할 수 있으며, 월은 키 'month'
와 번호 2로 접근할 수 있고, 나머지도 마찬가지입니다:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
설명된 명명된 캡처 그룹은 몇 가지
대체 문법도 가지고 있습니다: (?P<name>pattern)
와 (?'name'pattern).
시간 문자열이 주어졌습니다:
<?php
$str = '12:59:59';
?>
시, 분, 초를 각각 별도의 명명된 캡처 그룹에 저장하세요.
결과 배열에서 번호가 매겨진 모든 캡처 그룹을 삭제하고 명명된 캡처 그룹만 남기는 함수를 작성하세요.