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.
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.
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;
}
echo my_sprintf("Willkommen %s,Du hast %d Neue Nachrichten。", "Alice", 5);
Ausgabe:
Willkommen Alice,Du hast 5 Neue Nachrichten。
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;
}
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
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;
}
echo my_sprintf_extended("Bestellnummer:%05d,Benutzer:%s", 42, "bob");
Ausgabe:
Bestellnummer:00042,Benutzer:bob
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.