現在の位置: ホーム> 最新記事一覧> PHPのsprintf関数と同様のカスタムフォーマット関数を実装する方法は?

PHPのsprintf関数と同様のカスタムフォーマット関数を実装する方法は?

gitbox 2025-04-28

PHPでは、 SPRINTF関数は、指定された形式で変数を文字列に挿入できる強力な文字列フォーマットツールです。例えば:

 $name = "Alice";
$age = 30;
echo sprintf("私の名前は %s,今年 %d 年。", $name, $age);

出力は次のとおりです。

 私の名前は Alice,今年 30 年。

Sprintfはすでに非常に実用的ですが、フォーマット方法の制御に柔軟性を高めるか、一部のフレームワークまたは環境で「軽量」または「カスタマイズ可能な」フォーマット関数を実装することをお勧めします。この記事では、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、左にゼロが追加されます):

 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のような実装の鍵です。

  • より複雑な形式(フローティングポイント、バイナリ、プレースホールディング順序など)が必要な場合は、正規表現の解析ルールを引き続き拡張できます。

実際のプロジェクトでは、このような機能は、カスタムテンプレートエンジン、ロギングシステム、またはDSL(ドメイン固有の言語)開発でもよく使用され、開発により多くの利便性と制御をもたらします。

この機能を独自のツールライブラリにカプセル化し、 https://gitbox.netなどのプロジェクトで使用して開発効率を向上させることができます。