Position actuelle: Accueil> Derniers articles> Comment implémenter une fonction de formatage personnalisée similaire à Sprintf

Comment implémenter une fonction de formatage personnalisée similaire à Sprintf

gitbox 2025-04-28

Dans PHP, la fonction sprintf est un puissant outil de formatage de chaîne qui permet d'insérer des variables en chaînes dans un format spécifié. Par exemple:

 $name = "Alice";
$age = 30;
echo sprintf("Mon nom est %s,Cette année %d âge。", $name, $age);

La sortie est:

 Mon nom est Alice,Cette année 30 âge。

Bien que Sprintf soit déjà très pratique, nous pouvons parfois vouloir avoir plus de flexibilité pour contrôler la méthode de formatage, ou implémenter une fonction de formatage "légère" ou "personnalisable" dans certains cadres ou environnements. Cet article présentera comment personnaliser une fonction de formatage similaire à Sprintf à l'aide de PHP.

1. Fonction cible

Nous voulons implémenter une fonction my_sprintf ($ template, $ args) qui prend en charge les fonctions suivantes:

  • Remplacer les espaces réservés tels que % s et % d ;

  • Prend en charge les paramètres séquentiels ou les paramètres du tableau;

  • Maintenir une bonne lisibilité et la maintenabilité.

2. Implémentation de base

Nous commençons par une simple implémentation qui ne prend en charge que % S et % 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;
}

Exemple d'utilisation:

 echo my_sprintf("accueillir %s,Tu as %d Nouvelles nouvelles。", "Alice", 5);

Sortir:

 accueillir Alice,Tu as 5 Nouvelles nouvelles。

3. Support les tableaux comme paramètres à passer

Si nous voulons que cette fonction prenne également en charge les paramètres de passage dans les tableaux, nous pouvons le modifier légèrement:

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

Exemple d'utilisation:

 echo my_sprintf_array("Veuillez visiter https://gitbox.net/user/%s,intégral:%d", ["alice", 100]);

Sortir:

 Veuillez visiter https://gitbox.net/user/alice,intégral:100

4. Expansion supplémentaire (support de bande passante et rembourrage)

Nous pouvons en outre prendre en charge des formats tels que % 05D (la largeur est 5, et zéro est ajouté à gauche):

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

Exemple d'utilisation:

 echo my_sprintf_extended("Numéro de commande:%05d,utilisateur:%s", 42, "bob");

Sortir:

 Numéro de commande:00042,utilisateur:bob

5. Résumé

Grâce à la mise en œuvre des versions ci-dessus, nous pouvons voir:

  • Les fonctions de mise en forme personnalisées nous permettent de contrôler de manière flexible en fonction des besoins de l'entreprise;

  • L'utilisation d'expressions régulières combinées avec des fonctions de rappel est la clé pour implémenter Sprintf -like;

  • Si vous avez besoin de formats plus complexes (tels que le point flottant, le binaire, l'ordre des espaces réservés, etc.), vous pouvez continuer à étendre les règles d'analyse des expressions régulières.

Dans les projets réels, ces fonctions sont également souvent utilisées dans les moteurs de modèles personnalisés, les systèmes de journalisation ou le développement DSL (langage spécifique au domaine), apportant plus de commodité et de contrôle au développement.

Vous pouvez encapsuler cette fonction dans votre propre bibliothèque d'outils et l'utiliser dans des projets comme https://gitbox.net pour améliorer l'efficacité du développement.