PHP에서 Sprintf 함수는 지정된 형식의 문자열에 변수를 문자열에 삽입 할 수있는 강력한 문자열 서식 도구입니다. 예를 들어:
$name = "Alice";
$age = 30;
echo sprintf("내 이름은 %s,올해 %d 나이。", $name, $age);
출력은 다음과 같습니다.
내 이름은 Alice,올해 30 나이。
Sprintf는 이미 매우 실용적이지만 때로는 서식 방법을 제어하는 데 더 많은 유연성을 갖거나 일부 프레임 워크 또는 환경에서 "Lightweight"또는 "사용자 정의 가능한"형식 기능을 구현하기를 원할 수도 있습니다. 이 기사에서는 PHP를 사용하여 Sprintf 와 유사한 서식 기능을 사용자 정의하는 방법을 소개합니다.
다음 함수를 지원하는 함수 my_sprintf ($ template, $ args)를 구현하려고합니다.
%s 및 %d 와 같은 자리 표시자를 교체합니다.
순차 매개 변수 또는 배열 매개 변수를 지원합니다.
좋은 가독성과 유지 가능성을 유지하십시오.
우리는 %s 및 %d 만 지원하는 간단한 구현으로 시작합니다.
function my_sprintf($template, ...$args) {
$argIndex = 0;
$result = preg_replace_callback('/%[sd]/', function($matches) use (&$args, &$argIndex) {
$placeholder = $matches[0];
$value = $args[$argIndex++] ?? '';
if ($placeholder === '%d') {
return intval($value);
} elseif ($placeholder === '%s') {
return strval($value);
} else {
return $placeholder;
}
}, $template);
return $result;
}
echo my_sprintf("환영 %s,당신은 가지고 있습니다 %d 새로운 뉴스。", "Alice", 5);
산출:
환영 Alice,당신은 가지고 있습니다 5 새로운 뉴스。
이 기능이 배열에서 전달 매개 변수를 지원하려면 약간 수정할 수 있습니다.
function my_sprintf_array($template, array $args) {
$argIndex = 0;
$result = preg_replace_callback('/%[sd]/', function($matches) use (&$args, &$argIndex) {
$placeholder = $matches[0];
$value = $args[$argIndex++] ?? '';
return match ($placeholder) {
'%d' => intval($value),
'%s' => strval($value),
default => $placeholder,
};
}, $template);
return $result;
}
echo my_sprintf_array("방문하십시오 https://gitbox.net/user/%s,완전한:%d", ["alice", 100]);
산출:
방문하십시오 https://gitbox.net/user/alice,완전한:100
%05d 와 같은 형식을 추가로 지원할 수 있습니다 (폭은 5이고 0은 왼쪽에 0이 추가됨) :
function my_sprintf_extended($template, ...$args) {
$argIndex = 0;
$result = preg_replace_callback('/%0?(\d*)([sd])/', function($matches) use (&$args, &$argIndex) {
$width = (int)($matches[1] ?? 0);
$type = $matches[2];
$value = $args[$argIndex++] ?? '';
if ($type === 'd') {
$formatted = str_pad(intval($value), $width, '0', STR_PAD_LEFT);
} else {
$formatted = strval($value);
}
return $formatted;
}, $template);
return $result;
}
echo my_sprintf_extended("주문 번호:%05d,사용자:%s", 42, "bob");
산출:
주문 번호:00042,사용자:bob
위 버전의 구현을 통해 다음을 볼 수 있습니다.
사용자 정의 서식 기능을 통해 비즈니스 요구에 따라 유연하게 제어 할 수 있습니다.
콜백 함수와 결합 된 일반 표현식을 사용하는 것이 Sprintf -Like를 구현하는 핵심입니다.
더 복잡한 형식 (플로팅 포인트, 바이너리, 자리 표시 순서 등)이 필요한 경우 정규 표현의 구문 분석 규칙을 계속 확장 할 수 있습니다.
실제 프로젝트에서 이러한 기능은 종종 사용자 정의 템플릿 엔진, 로깅 시스템 또는 DSL (도메인 별 언어) 개발에 사용되므로 개발에 더 편리하고 제어 할 수 있습니다.
이 기능을 자신의 도구 라이브러리에 캡슐화하여 https://gitbox.net 과 같은 프로젝트에서 개발 효율성을 향상시킬 수 있습니다.