반응형
Web Development · PHP 문자열 함수
PHP substr() — 문자열에서 원하는 부분만 잘라내기
시작 위치 · 길이 지정 · 음수 인덱스 · mb_substr 차이 완전 정리
시작 오늘 분석할 코드
substr()은 문자열에서 지정한 위치부터 지정한 길이만큼 추출하는 함수입니다. 시작 위치(start)와 길이(length)의 두 가지 핵심 인수를 이해하면, 문자열의 어느 부분이든 정확하게 잘라낼 수 있습니다.
<?php $string = "ABCDEFGHIJKLMN"; $result = substr($string, 3, 5); // 인덱스 3(D)부터 시작해서 5글자 추출 // A=0, B=1, C=2, D=3, E=4, F=5, G=6, H=7 // 결과: "DEFGH" print $result; // DEFGH ?>
실제 출력 미리보기
[0]
A[1]
B[2]
C[3]↑
DE
EF
FG
GH
H[8]
I···
substr("ABCDEFGHIJKLMN", 3, 5) = "DEFGH" (인덱스 3부터 5글자)
용어 용어 정리
substr()substr($string, $start, $length) — 시작 위치부터 지정 길이만큼 문자열 추출
$start (시작 위치)0부터 시작하는 인덱스. 음수면 끝에서부터 역산
$length (길이)추출할 문자 수. 생략하면 start부터 끝까지. 음수면 끝에서 n글자 제외
음수 start-3이면 끝에서 3번째 문자부터 시작. "ABCDE"에서 -3이면 "C"부터
음수 length-3이면 끝에서 3글자를 제외하고 나머지 추출
mb_substr()멀티바이트(한글 등) 문자를 글자 단위로 안전하게 추출하는 함수
0-indexed인덱스는 0부터 시작. 첫 글자의 인덱스는 0, 두 번째는 1
반환값추출된 새 문자열 반환. 원본 $string은 변경되지 않음
1 시작 위치의 의미 — 왜 0부터 세는가?
인덱스는 0부터 — 첫 글자가 [0]
substr()의 start 인수는 0부터 시작하는 인덱스입니다. "ABCDEFGHIJKLMN"에서 A는 0번, B는 1번, C는 2번, D는 3번입니다. substr($s, 3, 5)는 "3번 위치(D)에서 5글자" → DEFGH를 추출합니다.
$s = "ABCDEFGHIJKLMN"; // 인덱스: A=0, B=1, C=2, D=3, E=4, F=5, G=6, H=7 substr($s, 0, 3); // "ABC" (0번부터 3글자) substr($s, 3, 5); // "DEFGH" (3번부터 5글자) substr($s, 7); // "HIJKLMN" (7번부터 끝까지 — length 생략)
※ 세 번째 인수(length)를 생략하면 시작 위치부터 문자열 끝까지 모두 반환합니다.
2 음수 start — 끝에서 역산하기
-1은 마지막 글자, -3은 뒤에서 세 번째
start에 음수를 넣으면 문자열의 끝에서부터 역산한 위치가 시작점이 됩니다. 마지막 글자에서 시작하거나, 끝에서 N번째 위치부터 추출할 때 편리합니다.
$s = "ABCDEFGHIJKLMN"; // 총 14글자 substr($s, -1); // "N" (끝에서 1번째 = 마지막 글자) substr($s, -3); // "LMN" (끝에서 3번째부터 끝까지) substr($s, -5, 3); // "JKL" (끝에서 5번째부터 3글자)
※ 파일 확장자 추출이 대표적인 활용 패턴입니다:
substr($filename, -3)으로 "jpg", "png" 같은 3자리 확장자를 추출할 수 있습니다.3 음수 length — 끝에서 N글자 제외
length가 음수면 끝에서 그만큼 빼고 추출
length에 음수를 넣으면 "start부터 시작해서 끝에서 |length|글자를 제외한 나머지"를 추출합니다. 특정 접미사나 끝 부분을 제거하고 나머지를 얻을 때 유용합니다.
$s = "ABCDEFGHIJKLMN"; substr($s, 0, -3); // "ABCDEFGHIJK" (전체에서 끝 3글자 제외) substr($s, 2, -2); // "CDEFGHIJKL" (2번부터 끝 2글자 제외)
반응형
4 substr vs mb_substr — 한글이 있을 때 주의
substr은 바이트 기준, mb_substr은 글자 기준으로 자름
substr()은 바이트 단위로 자릅니다. UTF-8에서 한글 1글자는 3바이트이므로, substr으로 자르면 글자 중간에 잘려 깨진 문자가 출력될 수 있습니다. 한글이 포함된 경우 반드시 mb_substr()을 사용해야 합니다.
substr — 바이트 기준 (위험)
$s = "안녕하세요";
substr($s, 0, 3);
결과: 깨진 문자
(한글 1자=3byte, 3byte를 자르면
"안"의 바이트만 잘림)
substr($s, 0, 3);
결과: 깨진 문자
(한글 1자=3byte, 3byte를 자르면
"안"의 바이트만 잘림)
mb_substr — 글자 기준 (안전)
$s = "안녕하세요";
mb_substr($s, 0, 3, 'UTF-8');
결과: "안녕하"
(0번부터 3글자 추출)
mb_substr($s, 0, 3, 'UTF-8');
결과: "안녕하"
(0번부터 3글자 추출)
⚠️ 한글·중문·일문 등 멀티바이트 문자가 포함될 수 있는 문자열을 자를 때는 반드시
mb_substr()을 사용하세요.5 실전 활용 — 미리보기, 확장자, 코드 추출
substr의 가장 흔한 3가지 사용 패턴
substr()은 문자열 처리에서 매우 광범위하게 쓰입니다. 대표적인 활용 패턴 세 가지를 알아두면 실무에서 바로 응용할 수 있습니다.
// 1. 미리보기 텍스트 — 100글자만 추출 (영문/숫자만 있을 때) $preview = substr($content, 0, 100) . "..."; // 2. 파일 확장자 추출 $filename = "image.jpg"; $ext = substr($filename, strrpos($filename, '.') + 1); echo $ext; // "jpg" // 3. 날짜 문자열에서 연도 추출 $date = "2026-06-24"; $year = substr($date, 0, 4); // "2026" $month = substr($date, 5, 2); // "06" $day = substr($date, 8, 2); // "24"
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| 한글 문자열에 substr 사용 | 글자 중간이 잘려 깨진 문자 출력 | 한글 포함 시 mb_substr($s, $start, $len, 'UTF-8') 사용 |
| 1-indexed로 착각 (1이 첫 글자) | 원하는 위치보다 한 글자 뒤에서 시작 | 0-indexed 확인 — 첫 글자는 0 |
| length를 끝 위치로 착각 | substr($s, 3, 7)에서 인덱스 7번까지가 아니라 7글자 추출 | length는 끝 인덱스가 아닌 추출할 글자 수 |
| 반환값을 변수에 안 받음 | 원본이 변경된 줄 알고 사용 — 값은 변경 안 됨 | $result = substr() 형태로 결과 저장 |
| start가 문자열 길이를 초과 | PHP 8.0+에서 빈 문자열 반환, PHP 7에서 false 반환 | start 범위 체크 후 사용, 버전별 반환값 주의 |
핵심 한 줄 요약
기본 사용법substr($s, $start, $len) — 0번부터 세어 start 위치에서 len글자 추출
음수 start끝에서부터 역산 — substr("ABCD", -2) = "CD"
음수 length끝에서 n글자 제외 후 추출 — substr("ABCD", 0, -1) = "ABC"
한글 처리mb_substr() 사용 필수 — substr은 바이트 기준으로 잘라 글자 깨짐
자주 쓰는 패턴미리보기 텍스트 자르기, 확장자 추출, 날짜 파싱
Tags
#PHP #substr #부분문자열 #문자열자르기 #mb_substr #음수인덱스 #문자열추출 #PHP문자열함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, substr, 부분문자열, 문자열자르기, mb_substr, 음수인덱스, 문자열추출, PHP문자열함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP time() — 유닉스 타임스탬프 · date() 연계 · 날짜 계산 완전 정리 (0) | 2026.07.10 |
|---|---|
| PHP trim() — 양끝 공백 제거 · ltrim · rtrim · 커스텀 문자 완전 정리 (0) | 2026.07.10 |
| PHP str_replace() — 문자열 찾아 바꾸기 · 배열 치환 · 대소문자 완전 정리 (0) | 2026.07.10 |
| PHP strip_tags() — HTML 태그 제거 · 허용 태그 지정 · XSS 방어 완전 정리 (0) | 2026.07.10 |
| PHP mb_strlen() — 한글 글자 수 정확히 세기 · strlen과 차이 완전 정리 (0) | 2026.07.10 |
왕진 블로그

댓글