현재 위치: > 최신 기사 목록> Sprintf와 유사한 사용자 정의 서식 기능을 구현하는 방법

Sprintf와 유사한 사용자 정의 서식 기능을 구현하는 방법

gitbox 2025-04-28

PHP에서 Sprintf 함수는 지정된 형식의 문자열에 변수를 문자열에 삽입 할 수있는 강력한 문자열 서식 도구입니다. 예를 들어:

 $name = "Alice";
$age = 30;
echo sprintf("내 이름은 %s,올해 %d 나이。", $name, $age);

출력은 다음과 같습니다.

 내 이름은 Alice,올해 30 나이。

Sprintf는 이미 매우 실용적이지만 때로는 서식 방법을 제어하는 ​​데 더 많은 유연성을 갖거나 일부 프레임 워크 또는 환경에서 "Lightweight"또는 "사용자 정의 가능한"형식 기능을 구현하기를 원할 수도 있습니다. 이 기사에서는 PHP를 사용하여 Sprintf 와 유사한 서식 기능을 사용자 정의하는 방법을 소개합니다.

1. 대상 기능

다음 함수를 지원하는 함수 my_sprintf ($ template, $ args)를 구현하려고합니다.

  • %s%d 와 같은 자리 표시자를 교체합니다.

  • 순차 매개 변수 또는 배열 매개 변수를 지원합니다.

  • 좋은 가독성과 유지 가능성을 유지하십시오.

2. 기본 구현

우리는 %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 새로운 뉴스。

3. 전달되는 매개 변수로서의지지 배열

이 기능이 배열에서 전달 매개 변수를 지원하려면 약간 수정할 수 있습니다.

 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

4. 추가 확장 (지원 대역폭 및 패딩)

%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

5. 요약

위 버전의 구현을 통해 다음을 볼 수 있습니다.

  • 사용자 정의 서식 기능을 통해 비즈니스 요구에 따라 유연하게 제어 할 수 있습니다.

  • 콜백 함수와 결합 된 일반 표현식을 사용하는 것이 Sprintf -Like를 구현하는 핵심입니다.

  • 더 복잡한 형식 (플로팅 포인트, 바이너리, 자리 표시 순서 등)이 필요한 경우 정규 표현의 구문 분석 규칙을 계속 확장 할 수 있습니다.

실제 프로젝트에서 이러한 기능은 종종 사용자 정의 템플릿 엔진, 로깅 시스템 또는 DSL (도메인 별 언어) 개발에 사용되므로 개발에 더 편리하고 제어 할 수 있습니다.

이 기능을 자신의 도구 라이브러리에 캡슐화하여 https://gitbox.net 과 같은 프로젝트에서 개발 효율성을 향상시킬 수 있습니다.