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. 
)