PHP
[PHP] sscanf()으로 문자열 파싱하기
teamnova
2025. 10. 30. 13:01
728x90
안녕하세요.
오늘은 sscanf()으로 문자열 파싱해보도록 하겠습니다.
우리는 종종 로그 파일처럼 일정한 형식(예 : [날짜 시간] 레벨: 메시지) 을 가진 문자열을 파싱해야 할 때가 있습니다.
이럴 때 sscanf() 함수를 사용하면 마법처럼 깔끔하게 문제를 해결할 수 있습니다.
sscanf는 우리가 제공한 '형식(format)'을 기반으로 문자열을 스캔하여, 원하는 부분을 변수에 담아줍니다.
예제
<?php
// 1. 파싱할 원본 로그 문자열
$logString = '[2025-10-30 12:30:01] ERROR: User 123 failed login.';
// 2. 파싱된 데이터를 담을 변수들을 null로 미리 초기화
$date = $time = $level = $userId = $message = null;
// 3. sscanf() 함수로 문자열 파싱 실행
//
// 포맷 문자열 상세 해설:
// [%s %[^]]]
// [ : 첫 번째 '[' 문자와 일치
// %s : 첫 번째 공백이 나오기 전까지의 문자열 (날짜)
// %[^]] : ']' 문자가 나오기 전까지의 모든 문자열 (시간)
// ] : ']' 문자와 일치
// (공백) : ']' 뒤의 공백
// %[^:]: : ':' 문자가 나오기 전까지의 모든 문자열 (레벨)
// : 그 뒤에 오는 ':' 문자와 일치
// (공백) : ':' 뒤의 공백
// User %d : 'User ' 문자열과 그 뒤의 10진수 정수 (ID)
// (공백) : ID 뒤의 공백
// %[^\n] : 줄바꿈(\n) 전까지의 나머지 모든 문자열 (메시지)
sscanf(
$logString,
"[%s %[^]]] %[^:]: User %d %[^\n]",
$date,
$time,
$level,
$userId,
$message
);
// 4. 결과 출력
$parsedData = [
'date' => $date,
'time' => $time,
'level' => $level, // "ERROR" (콜론 없음)
'userId' => $userId,
'message' => isset($message) ? trim($message) : null
];
print_r($parsedData);
?>
결과
Array
(
[date] => 2025-10-30
[time] => 12:30:01
[level] => ERROR
[userId] => 123
[message] => failed login.
)