정의 및 사용 방법
- PHP 버전
- 7.4+
mb_str_split() 함수는
한글과 같은 multi-byte 문자열을 원하는 일정한 길이의 부분 문자열로 분할하여 배열로 변환하는 함수입니다.
반환 값은 분할된 부분 문자열을 담은 배열입니다.
str_split() 함수와 거의 동일한 기능을 하지만, 한글과 같은 multi-byte 문자열에서 안전하게 작동하는 기능을 제공한다는 큰 차이점이 있습니다.
부연설명
UTF-8 인코딩에서 영어와 숫자 같은 ASCII 문자는 1 byte로 표현되지만, 한글이나 일본어, 중국어 등은 여러 byte를 사용합니다.
이처럼 하나의 문자를 표현하기 위해 2 byte 이상을 사용하는 문자를 multi-byte(멀티바이트) 문자열이라고 합니다.
PHP 7.4에서 도입된 함수로 PHP 7.4 이전의 버전에서는 호환되지 않습니다.
기본 예제
$str = '반갑습니다!';
/* 문자열의 길이를 1만큼으로 분할하는 예
str_split()과 mb_str_split()의 차이점 */
// 한글 지원하지 않음(길이는 1 byte 기준입니다.)
$arr1 = str_split($str, 1);
print_r($arr1);
/* 출력:
Array
(
[0] => �
[1] => �
[2] => �
[3] => �
[4] => �
[5] => �
[6] => �
[7] => �
[8] => �
[9] => �
[10] => �
[11] => �
[12] => �
[13] => �
[14] => �
[15] => !
)
*/
// 한글과 같은 multi-byte 문자열을 지원(길이는 문자 단위 기준입니다.)
$arr2 = mb_str_split($str, 1, 'UTF-8');
print_r($arr2);
/* 출력:
Array
(
[0] => 반
[1] => 갑
[2] => 습
[3] => 니
[4] => 다
[5] => !
)
*/
구문
mb_str_split(string $string, int $length = 1, ?string $encoding = null): array
매개변수
$string |
필수. 분할할 대상 문자열입니다. |
|---|---|
$length |
옵션. 각 부분 문자열의 길이를 지정하는 매개변수입니다. 이 매개변수를 사용하지 않으면 기본값으로 1이 지정되며, 각 문자를 하나의 요소로 하는 배열이 생성됩니다. |
$encoding |
옵션. 문자열의 인코딩을 지정합니다.
기본값은 null이며, 생략하거나 null을 전달하면 내부 문자 인코딩 값이 사용됩니다.
|
반환 값
매개변수로 전달된 $length 길이의 부분 문자열로 분할하여 배열로 변환해서 반환합니다.
이때 길이의 크기는 문자 단위 기준입니다.
변경 이력
| 버전 | 설명 |
|---|---|
| 8.0.0 | PHP 8.0.0부터 $encoding 매개변수가 이제 nullable하게 변경되었습니다. 이것은 이제 $encoding 매개변수를 생략하거나 null로 설정할 수 있음을 의미합니다. 이전에는 반드시 유효한 인코딩을 지정해야 했었습니다. |
| 8.0.0 | PHP 8.0.0부터 함수가 실패할 경우 더 이상 false를 반환하지 않습니다. 이전에는 함수가 실패할 때 false를 반환했지만, 이제는 실패한 경우에도 반환 값이 false가 아닙니다. 대신에 함수는 항상 배열을 반환하게 됩니다. 실패한 경우에는 빈 배열이 반환됩니다. |
활용 예제
mb_str_split() 함수는 멀티바이트 여부와 상관없이 문자열을 부분 문자열로 쉽게 분할할 수 있기 때문에 여러 가지 유용한 상황에서 활용할 수 있습니다.
몇 가지 예제를 살펴보겠습니다.
문자열을 역순으로 출력하기
문자열을 역순으로 출력하려면 mb_str_split() 함수를 사용하여 문자열을 배열로 분할한 다음, array_reverse() 함수를 사용하여 배열을 역순으로 변경할 수 있습니다.
역순으로 바뀐 배열은 다시 implode() 함수를 사용해서 배열을 문자열로 변환합니다.
$str = '환영합니다';
$array = mb_str_split($str, 1, 'UTF-8');
$reversed_array = array_reverse($array);
$reversed_string = implode('', $reversed_array);
echo $reversed_string; // 출력: '다니합영환'
코드 부연설명
array_reverse() 함수는 주어진 배열의 요소 순서를 역순(reverse)으로 반환합니다.
코드 부연설명
implode() 함수는 배열의 요소들을 하나의 문자열로 합치는(변환하는) 함수입니다.
이름/아이디 등에서 일부 정보 숨기기
이름이나 아이디 등의 민감한 정보에서 특정 부분을 숨기려면 mb_str_split() 함수를 사용하여 문자열을 분할한 다음 일부를 수정할 수 있습니다.
예를 들어 사용자 이름의 중간 글자를 *로 마스킹할 때, 한글 깨짐 없이 문자열을 배열로 변환하여 안전하게 처리합니다.
function mask_name($name) {
// 한글/다국어 문자열을 1글자씩 배열로 분할
$chars = mb_str_split($name, 1, 'UTF-8');
$length = count($chars);
if ($length <= 1) {
return $name;
}
if ($length === 2) {
// 2글자 이름 (예: 홍길 -> 홍*)
$chars[1] = '*';
} else {
// 3글자 이상 (예: 홍길동 -> 홍*동, 남궁길동 -> 남**동)
for ($i = 1; $i < $length - 1; $i++) {
$chars[$i] = '*';
}
}
return implode('', $chars);
}
echo mask_name("김"); // 김
echo "<br>";
echo mask_name("김민"); // 김*
echo "<br>";
echo mask_name("홍길동"); // 홍*동
echo "<br>";
echo mask_name("남궁민수"); // 남**수
echo "<br>";
echo mask_name("아름다운이름"); // 아****름
코드 부연설명
for 문은 특정 횟수나 범위만큼 반복하는 반복문입니다.
위의 예제들은 mb_str_split() 함수를 사용하여 문자열을 쉽게 다룰 수 있는 방법을 보여줍니다.
이 함수는 멀티바이트 여부와 상관없이 문자열을 부분 문자열로 나누는 데 유용하며, 이를 통해 문자열을 다양한 방식으로 가공할 수 있습니다.