Menu

PHP 문자열 자르기 substr(): 문자열 일부 가져오기

substr($string, $offset, $length)는 문자열의 일부를 반환합니다. 음수 오프셋, 처음이나 마지막 문자 가져오기, 한글과 일본어 등 UTF-8 텍스트를 위한 mb_substr, substr_count, 말줄임표로 텍스트 줄이기를 알아봅니다.

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

substr($string, $offset, $length)는 $string에서 위치 $offset(0부터 셈)에서 시작해 $length글자 길이의 부분을 반환합니다. substr('Hello world', 0, 5)는 "Hello"를 반환합니다. 끝까지 모두 가져오려면 $length를 생략하세요.

substr()는 바이트를 셉니다. 영어 텍스트에서는 문자 수와 같지만, 한글, 일본어, 중국어, 이모지, 악센트가 있는 문자에서는 다릅니다. 그런 텍스트에는 아래에서 보여 주는 mb_substr()를 쓰세요.

문법

substr(string $string, int $offset, ?int $length = null): string
  • $offset은 시작 위치입니다. 0이 첫 번째 문자입니다. 음수 값은 끝에서부터 셉니다.
  • $length는 가져올 바이트 수입니다(일반 ASCII 텍스트에서는 1바이트가 1문자). 음수 값은 끝에서 그만큼을 남깁니다. null(또는 생략)은 "끝까지"를 뜻합니다.

음수 오프셋과 길이: 끝에서부터 작업하기

음수 $offset은 문자열 끝에서부터 세므로 -1이 마지막 문자입니다. 음수 $length는 끝에서 그만큼 앞에서 멈춥니다.

substr($s, 0, -1)은 반복문이 남긴 끝 쉼표처럼 마지막 문자를 지우는 일반적인 방법입니다.

첫 번째나 마지막 문자 가져오기

한 바이트라면 문자열을 직접 인덱싱할 수도 있습니다. $s[0]은 첫 번째 문자이고, PHP 7.1부터 $s[-1]은 마지막 문자입니다.

존재하지 않는 위치를 인덱싱하면 경고가 나지만 substr()는 빈 문자열을 반환할 뿐입니다. 문자열이 비어 있을 수 있다면 substr()를 쓰세요.

범위 밖: false가 아니라 빈 문자열

$offset이 문자열 끝을 넘으면 PHP 8의 substr()는 ""를 반환합니다. PHP 7에서는 false를 반환했으므로 === false로 확인하던 예전 코드는 더 이상 동작하지 않습니다.

한글과 일본어 텍스트: mb_substr 쓰기

UTF-8은 가나와 일반 한자를 각각 3바이트에 저장합니다(한글도 3바이트이고, 𠮷 같은 드문 한자와 이모지는 4바이트). substr()는 바이트를 세므로 substr('こんにちは', 0, 3)은 こ만 반환하고, 문자 경계에 맞지 않는 길이는 문자를 반으로 잘라 깨진 텍스트를 만듭니다. mb_substr()는 같은 인수를 받고 문자를 셉니다.

이모지와 é 같은 악센트 문자도 마찬가지입니다. 문자 수는 mb_strlen()으로 셉니다. 바이트와 문자의 차이는 strlen()을 참고하세요.

말줄임표로 텍스트 줄이기

목록이나 카드용으로 긴 제목을 자르는 것이 substr()의 가장 흔한 실제 용도입니다. 제목이 문자 중간에서 잘리지 않도록 mb_substr()를 쓰고, 실제로 줄였을 때만 ...를 붙이세요.

mb_strimwidth($text, 0, $width, '...')는 같은 일을 화면 폭 기준으로 합니다. 전각 문자는 2칸, 라틴 문자는 1칸으로 셉니다. 고정 폭 레이아웃에 잘 맞습니다.

substr_count로 부분 문자열 세기

substr_count($haystack, $needle)는 $needle이 몇 번 나오는지 반환합니다. 대소문자를 구분하며 겹치는 일치는 세지 않습니다.

strpos와 함께 쓰는 substr: 특정 문자 앞이나 뒤의 텍스트

이메일 주소의 @처럼 위치를 미리 모르는 문자에서 자르려면 substr()를 strpos()와 조합하세요.

결과를 쓰기 전에 strpos()가 false를 반환하지 않았는지 확인하세요. 문자가 없으면 false가 경고 없이 0으로 취급되어 substr('nobody', 0, $at)은 ""를, substr('nobody', $at + 1)은 "obody"를 반환합니다.

자주 묻는 질문

PHP에서 문자열의 마지막 문자들을 가져오려면 어떻게 하나요?

음수 오프셋을 쓰세요: substr($s, -3)은 마지막 3문자를 반환합니다. 한글, 일본어 등 멀티바이트 문자가 들어갈 수 있는 텍스트에는 mb_substr($s, -3)을 쓰세요.

substr와 mb_substr의 차이는 무엇인가요?

substr()는 바이트를 세고 mb_substr()는 문자를 셉니다. UTF-8에서 가나와 일반 한자(한글도 마찬가지)는 각각 3바이트이므로 substr('日本語', 0, 2)는 문자를 반으로 자르고, mb_substr('日本語', 0, 2)는 "日本"을 반환합니다.

시작 위치가 문자열 끝을 넘으면 substr는 무엇을 반환하나요?

빈 문자열입니다. PHP 8.0부터 substr('abc', 5)는 ""를 반환하며, PHP 7은 false를 반환했습니다.

PHP에서 문자열의 마지막 문자를 제거하려면 어떻게 하나요?

substr($s, 0, -1)은 마지막 바이트를 뺀 전부를 반환합니다. 멀티바이트 텍스트에는 mb_substr($s, 0, -1)을, 특정 끝 문자만 지우려면 rtrim($s, ',')를 쓰세요.

PHP에서 부분 문자열이 몇 번 나오는지 세려면 어떻게 하나요?

substr_count($haystack, $needle)입니다: substr_count('banana', 'an')은 2를 반환합니다. 대소문자를 구분하며 겹치는 일치는 세지 않습니다.

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

Coddy로 코딩 배우기

시작하기