PHP에서 하나의 문자열에 섞여 있는 숫자와 알파벳을 각각 별도의 배열로 분리해야 하는 경우가 종종 있습니다. 이럴 때는 preg_split() 함수를 array_shift() 및 array_pop()과 함께 사용하면 간단하게 해결할 수 있습니다.
예를 들어 다음과 같이 숫자와 영문자가 섞인 문자열이 있다고 가정해 보겠습니다.
$values = "5j4o5h8n";
목표는 이 문자열에서 숫자만 모은 배열과 알파벳만 모은 배열을 따로 만드는 것입니다.
동작 원리
- preg_split("/\d+/", $values) — 정규 표현식 \d+(하나 이상의 연속된 숫자)를 기준으로 문자열을 나누어 알파벳 배열을 얻습니다. 분할 결과 맨 앞에는 불필요한 빈 문자열이 생기므로 array_shift()로 제거합니다.
- preg_split("/[a-z]+/", $values) — 정규 표현식 [a-z]+(하나 이상의 연속된 소문자)를 기준으로 나누어 숫자 배열을 얻습니다. 분할 결과 맨 뒤에는 빈 문자열이 남으므로 array_pop()으로 제거합니다.
예제 코드
<!DOCTYPE html>
<html>
<body>
<?php
$values = "5j4o5h8n";
// 알파벳만 추출
$singleValues = preg_split("/\d+/", $values);
array_shift($singleValues);
print_r($singleValues);
// 숫자만 추출
$resultNumber = preg_split("/[a-z]+/", $values);
array_pop($resultNumber);
print_r($resultNumber);
?>
</body>
</html>실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
Array ( [0] => j [1] => o [2] => h [3] => n ) Array ( [0] => 5 [1] => 4 [2] => 5 [3] => 8 )
대안: preg_match_all() 활용하기
빈 문자열을 정리하는 추가 작업 없이 더 직관적으로 값을 추출하고 싶다면 preg_match_all()을 사용하는 방법도 좋습니다.
<?php
$values = "5j4o5h8n";
preg_match_all('/\d/', $values, $numbers);
preg_match_all('/[a-z]/', $values, $letters);
print_r($numbers[0]);
print_r($letters[0]);
?>이 방식은 패턴에 일치하는 문자만 곧바로 배열로 수집하기 때문에 array_shift()나 array_pop()으로 빈 요소를 제거하는 과정이 필요 없다는 장점이 있습니다. 상황에 따라 preg_split() 방식과 preg_match_all() 방식 중 더 편리한 것을 선택해 사용하면 됩니다.