Aktueller Standort: Startseite> Neueste Artikel> So implementieren Sie eine benutzerdefinierte Formatierungsfunktion, die Spintf ähnelt

So implementieren Sie eine benutzerdefinierte Formatierungsfunktion, die Spintf ähnelt

gitbox 2025-04-28

In PHP ist die Sprintf -Funktion ein leistungsstarkes String -Formatierungswerkzeug, mit dem Variablen in Zeichenfolgen in einem angegebenen Format eingefügt werden können. Zum Beispiel:

 $name = "Alice";
$age = 30;
echo sprintf("Ich heiße %s,Dieses Jahr %d Alter。", $name, $age);

Die Ausgabe ist:

 Ich heiße Alice,Dieses Jahr 30 Alter。

Obwohl Sprintf bereits sehr praktisch ist, möchten wir manchmal mehr Flexibilität bei der Steuerung der Formatierungsmethode haben oder eine "leichte" oder "anpassbare" Formatierungsfunktion in einigen Frameworks oder Umgebungen implementieren. In diesem Artikel wird vorgestellt, wie eine Formatierungsfunktion ähnlich wie Sprintf mit PHP angepasst wird.

1. Zielfunktion

Wir möchten eine Funktion my_sprintf ($ template, $ args) implementieren, die die folgenden Funktionen unterstützt:

  • Ersetzen Sie Platzhalter wie %s und %d ;

  • Unterstützt sequentielle Parameter oder Array -Parameter;

  • Behalten Sie eine gute Lesbarkeit und Wartbarkeit bei.

2. Grundlegende Implementierung

Wir beginnen mit einer einfachen Implementierung, die nur %s und %d unterstützt:

 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;
}

Beispiel der Nutzung:

 echo my_sprintf("Willkommen %s,Du hast %d Neue Nachrichten。", "Alice", 5);

Ausgabe:

 Willkommen Alice,Du hast 5 Neue Nachrichten。

3.. Unterstützen Sie Arrays als Parameter, die übergeben werden sollen

Wenn wir möchten, dass diese Funktion auch die Übergabeparameter in Arrays unterstützt, können wir sie geringfügig ändern:

 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;
}

Beispiel der Nutzung:

 echo my_sprintf_array("Bitte besuchen Sie https://gitbox.net/user/%s,Integral:%d", ["alice", 100]);

Ausgabe:

 Bitte besuchen Sie https://gitbox.net/user/alice,Integral:100

4. Weitere Expansion (Unterstützungsbandbreite und Polsterung)

Wir können ferner Formate wie %05D unterstützen (die Breite ist 5 und null links hinzugefügt):

 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;
}

Beispiel der Nutzung:

 echo my_sprintf_extended("Bestellnummer:%05d,Benutzer:%s", 42, "bob");

Ausgabe:

 Bestellnummer:00042,Benutzer:bob

5. Zusammenfassung

Durch die Implementierung der obigen Versionen können wir sehen:

  • Benutzerdefinierte Formatierungsfunktionen ermöglichen es uns, flexibel entsprechend den geschäftlichen Anforderungen zu steuern.

  • Die Verwendung regulärer Ausdrücke in Kombination mit Callback -Funktionen ist der Schlüssel zur Implementierung von Sprintf -Like.

  • Wenn Sie komplexere Formate (z. B. Gleitkomma, binäre, Platzhalterung usw.) benötigen, können Sie die Parsing -Regeln von regulären Ausdrücken weiter erweitern.

In tatsächlichen Projekten werden solche Funktionen häufig auch in benutzerdefinierten Vorlagenmotoren, Protokollierungssystemen oder DSL-Entwicklung (Domänenspezifische Sprache) verwendet, die mehr Bequemlichkeit und Kontrolle in die Entwicklung bringen.

Sie können diese Funktion in Ihre eigene Toolbibliothek integrieren und in Projekten wie https://gitbox.net verwenden, um die Entwicklungseffizienz zu verbessern.