PHP에서 구분자 없이 붙어 있는 문자열을 특정 키워드 단위로 나누고 싶을 때가 있습니다. 이런 경우 preg_split()보다는 preg_match_all() 함수를 사용하는 것이 효과적입니다. preg_match_all()은 정규 표현식 패턴에 일치하는 모든 부분을 찾아 배열 형태로 반환해 주기 때문입니다.
문자열 준비하기
예를 들어 다음과 같은 문자열이 있다고 가정해 보겠습니다.
$values = 'javamysqlphpmongodbpythonspringhibernatephp';
이 문자열에서 java, hibernate, php라는 특정 값들을 기준으로 분할된 결과를 얻고 싶습니다.
java hibernate php
예제 코드
이를 구현한 PHP 코드는 다음과 같습니다.
<!DOCTYPE html>
<html>
<body>
<?php
$values = 'javamysqlphpmongodbpythonspringhibernatephp';
$afterSpliting = preg_match_all("/(java|hibernate|php)/", $values, $result);
print_r($result);
?>
</body>
</html>코드 설명
/(java|hibernate|php)/: 찾고자 하는 키워드들을 파이프(|)로 연결한 정규 표현식 패턴입니다.$result: 매칭된 결과가 저장될 배열입니다.preg_match_all()은 일치하는 항목의 개수를 반환하며, 전체 매칭 결과와 그룹별 결과를 모두 배열에 담아줍니다.
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Array (
[0] => Array ( [0] => java [1] => php [2] => hibernate [3] => php )
[1] => Array ( [0] => java [1] => php [2] => hibernate [3] => php )
)결과 해석
배열의 인덱스 [0]에는 정규 표현식 전체 패턴과 일치한 값들이 순서대로 저장되고, 인덱스 [1]에는 첫 번째 캡처 그룹(괄호 안의 패턴)에 해당하는 값들이 저장됩니다. 즉, 원본 문자열에서 java, php, hibernate, php가 차례대로 발견되었음을 확인할 수 있습니다.
이처럼 preg_match_all()을 활용하면 구분자가 없는 문자열이라도 원하는 키워드를 손쉽게 추출하여 분할된 것과 같은 효과를 얻을 수 있습니다.