Menu

PHP 문자열 자르기 explode(): 문자열을 배열로 분리

explode(',', $string)는 문자열을 쉼표마다 나누고 조각들을 배열로 반환합니다. limit 매개변수, 줄바꿈으로 나누기, 조각 trim하기, str_split나 preg_split가 더 나은 경우를 알아봅니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

explode($separator, $string)는 $separator가 나올 때마다 문자열을 나누고 조각들을 배열로 반환합니다. explode(',', 'apple,banana,cherry')는 ['apple', 'banana', 'cherry']를 줍니다.

구분자는 한 글자만이 아니라 어떤 문자열이든 될 수 있습니다. explode(' and ', 'tea and milk and sugar')도 같은 방식으로 동작합니다. 반대 작업, 즉 배열을 다시 문자열로 합치는 것은 implode()입니다.

문법과 반환값

explode(string $separator, string $string, int $limit = PHP_INT_MAX): array

항상 배열을 반환합니다. 구분자가 나오지 않으면 배열에는 문자열 전체가 유일한 요소로 들어갑니다. 빈 문자열도 마찬가지라서 빈 문자열 하나가 든 배열이 되며, "빈 입력에서 반복문이 한 번 돈다"는 버그의 흔한 원인입니다.

조각 개수 제한하기

세 번째 인수 $limit은 받는 조각의 개수를 바꿉니다.

  • 양수 limit은 최대 그 개수만큼 조각을 반환합니다. 마지막 조각에는 구분자를 포함한 나머지 문자열이 담깁니다.
  • 음수 limit은 마지막 abs($limit)개를 뺀 모든 조각을 반환합니다.
  • limit 0은 1로 취급됩니다.

첫 번째 구분자만 중요할 때, 예를 들어 값에도 =가 들어갈 수 있는 key=value 줄에는 양수 limit이 맞는 도구입니다: explode('=', 'query=a=b', 2)는 ['query', 'a=b']를 줍니다. 다음 절들에서 이렇게 씁니다.

마지막 조각만 얻으려면 먼저 배열을 변수에 저장하세요: $parts = explode('/', $path); $file = end($parts);. end(explode('/', $path))라고 써도 올바른 값을 반환하지만, end()가 인수를 참조로 받기 때문에 PHP가 Notice: Only variables should be passed by reference를 출력합니다.

줄바꿈으로 문자열 나누기

explode("\n", $text)는 줄바꿈에서 나눕니다. 큰따옴표를 쓰세요. 작은따옴표 안의 '\n'은 줄바꿈이 아니라 백슬래시 뒤에 문자 n이 온 것입니다. Windows 파일이나 HTML 폼에서 온 텍스트는 줄 끝이 "\r\n"인 경우가 많아 각 조각 끝에 "\r"이 남습니다. preg_split('/\R/', $text)는 모든 종류의 줄바꿈에서 나눕니다.

조각 trim하고 빈 조각 버리기

"red, green , ,blue" 같은 사용자 입력에는 항목 주변에 공백이 있고 가운데에 빈 항목이 있습니다. 조각들을 array_map()으로 trim()에 통과시킨 다음 array_filter()로 빈 문자열을 제거하세요. array_filter()는 원래 키를 유지하므로 그 뒤에 array_values()로 키를 다시 매깁니다.

콜백 fn($c) => $c !== ''는 문자열 "0"을 남깁니다. 그냥 array_filter($colors)를 쓰면 "0"이 거짓으로 취급되어 버려집니다.

문자열을 연관 배열로 바꾸기

설정, 쿠키, 쿼리 형태의 문자열은 흔히 key=value 쌍으로 저장됩니다. 두 번 explode하세요. 한 번은 쌍으로, 한 번은 각 쌍을 limit 2로 나누고, 두 조각을 변수로 풀어 넣습니다(배열 구조 분해).

debug처럼 =가 없는 쌍은 요소 하나짜리 배열이 되고, 구조 분해가 Warning: Undefined array key 1을 출력합니다. 이를 피하려면 결과를 두 요소로 채우세요: [$key, $value] = explode('=', $pair, 2) + [1 => ''];.

실제 URL 쿼리 문자열이라면 parse_str()이 이 작업을 대신하고 %20과 +도 디코딩합니다.

여러 구분자로 나누기

explode()는 구분자를 하나만 받습니다. 쉼표, 세미콜론, 공백에서 나누려면 문자 클래스와 함께 preg_split()을 쓰세요. PREG_SPLIT_NO_EMPTY는 구분자가 연달아 나올 때 생기는 빈 조각을 버립니다.

일본어 등 UTF-8 텍스트

explode()는 바이트를 비교하며, UTF-8에서 온전한 문자는 다른 문자의 바이트 안에 나타나지 않으므로 、나 전각 쉼표 같은 일본어 구분자로 일본어 텍스트를 나누는 것도 올바르게 동작합니다.

explode, str_split, preg_split 비교

함수나누는 기준예제결과
explode()고정된 구분자 문자열explode('-', '2026-03-14')['2026', '03', '14']
str_split()N바이트마다str_split('abcdef', 2)['ab', 'cd', 'ef']
mb_str_split()N문자마다mb_str_split('日本語')['日', '本', '語']
preg_split()정규 표현식preg_split('/\s+/', 'a b')['a', 'b']

explode()는 정규식 작업을 하지 않으므로 preg_split()보다 빠르며, 구분자가 고정된 문자열이라면 언제나 먼저 쓸 함수입니다.

흔한 실수: 빈 구분자

빈 구분자는 에러입니다. PHP 8.0부터 explode('', 'abc')는 false를 반환하는 대신 ValueError를 던지고 스크립트가 멈춥니다.

PHP Fatal error:  Uncaught ValueError: explode(): Argument #1 ($separator) cannot be empty in /home/index.php:3

문자열을 글자 단위로 나누려면 ASCII 텍스트에는 str_split('abc')를, 멀티바이트 문자가 들어갈 수 있는 텍스트에는 mb_str_split($s)를 쓰세요.

자주 묻는 질문

PHP에서 explode()는 무엇을 하나요?

구분자가 나올 때마다 문자열을 나누고 조각들을 배열로 반환합니다: explode(',', 'a,b,c')는 ['a', 'b', 'c']를 반환합니다. 구분자 자체는 어느 조각에도 포함되지 않습니다.

구분자를 찾지 못하면 explode()는 무엇을 반환하나요?

문자열 전체를 요소 하나로 담은 배열입니다: explode(',', 'apple')은 ['apple']을 반환합니다. 빈 문자열은 빈 문자열 하나가 든 배열 ['']을 주므로 count()는 0이 아니라 1을 반환합니다.

PHP에서 여러 구분자로 문자열을 explode하려면 어떻게 하나요?

문자 클래스와 함께 preg_split()을 쓰세요: preg_split('/[,;|]/', $s)는 쉼표, 세미콜론, 파이프에서 나눕니다. 빈 조각도 버리려면 limit -1과 플래그를 넘기세요: preg_split('/[,;|]/', $s, -1, PREG_SPLIT_NO_EMPTY).

explode()와 str_split()의 차이는 무엇인가요?

explode()는 직접 고른 구분자에서 나눕니다. str_split($s, 3)은 문자열을 바이트 단위로 센 고정 길이 조각으로 자릅니다. 한글 같은 멀티바이트 텍스트에는 문자 단위로 세는 mb_str_split($s)를 쓰세요.

explode()가 ValueError를 던지는 이유는 무엇인가요?

구분자가 빈 문자열이기 때문입니다. PHP 8.0부터 explode('', $s)는 ValueError: explode(): Argument #1 ($separator) cannot be empty를 던집니다. 문자열을 한 글자씩 나누려면 str_split()이나 mb_str_split()을 쓰세요.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기