4 Stimmen

So prüfen Sie, ob vsprintf die richtige Anzahl von Argumenten hat, bevor Sie es ausführen

Ich versuche, vsprintf() zu verwenden, um eine formatierte Zeichenfolge auszugeben, aber ich muss überprüfen, dass ich die richtige Anzahl von Argumenten haben, bevor Sie es ausführen, um "Zu wenige Argumente" Fehler zu vermeiden.

Im Wesentlichen denke ich, was ich brauche, ist ein Regex, um die Anzahl der Typ-Bezeichner zu zählen, aber ich bin ziemlich nutzlos, wenn es um Regex kommt und ich konnte es nirgends finden, so dass ich dachte, ich würde SO einen Versuch geben :)

Wenn Ihnen nichts Besseres einfällt, entspricht diese Methode genau dem, was ich will.

function __insertVars($string, $vars = array()) {

    $regex = '';
    $total_req = count(preg_match($regex, $string));

    if($total_req === count($vars)) {
        return vsprintf($string, $vars);
    }

}

Bitte teilen Sie mir mit, ob Ihnen ein einfacherer Weg einfällt.

5voto

Alix Axel Punkte 146320

Ich denke, Ihre Lösung ist der einzige Weg, um mehr oder weniger zuverlässig festzustellen, wie viele Argumente in der Zeichenkette sind.

Hier ist der reguläre Ausdruck, den ich mir ausgedacht habe, verwenden Sie ihn mit preg_match_all() :

%[-+]?(?:[ 0]|['].)?[a]?\d*(?:[.]\d*)?[%bcdeEufFgGosxX]

Basierend auf sprintf() Dokumentation . Sollte kompatibel sein mit PHP 4.0.6+ / 5 .


エディテージ - Eine etwas kompaktere Version:

%[-+]?(?:[ 0]|'.)?a?\d*(?:\.\d*)?[%bcdeEufFgGosxX]

Nutzen Sie auch die func_get_args() y func_num_args() Funktionen in Ihrem Code.


EDIT: - Aktualisiert, um positionale/vertauschende Argumente zu unterstützen ( nicht getestet ):

function validatePrintf($format, $arguments)
{
    if (preg_match_all("~%(?:(\d+)[$])?[-+]?(?:[ 0]|['].)?(?:[-]?\d+)?(?:[.]\d+)?[%bcdeEufFgGosxX]~", $format, $expected) > 0)
    {
        $expected = intval(max($expected[1], count(array_unique($expected[1]))));

        if (count((array) $arguments) >= $expected)
        {
            return true;
        }
    }

    return false;
}

var_dump(validatePrintf('The %2$s contains %1$d monkeys', array(5, 'tree')));

1voto

user3551026 Punkte 455

Ich denke, es ist sehr einfach, weil es FALSE Wert zurückgibt, wenn etwas falsch. Sie können wie folgt überprüfen:

if (vsprintf($string, $wrongArray) === false) {
    // vsprintf has wrong number of arguments
}

0voto

Mykhailo Shatilov Punkte 101

Ich habe die Antwort von Alix Axel verwendet und eine universelle Funktion erstellt.

Wir haben eine $countArgs (aus Funktionsparametern) und $countVariables (aus $format wie %s ).

Zum Beispiel:

$object->format('Hello, %s!', ['Foo']); // $countArgs = 1, $countVariables = 1;

Drucken: Hallo, Foo!

$object->format('Hello, %s! How are you, %s?', ['Bar']); // $countArgs = 1, $countVariables = 2;

Drucken: Fehler.

Funktion:

public static function format($format, array $args)
{
    $pattern = "~%(?:(\d+)[$])?[-+]?(?:[ 0]|['].)?(?:[-]?\d+)?(?:[.]\d+)?[%bcdeEufFgGosxX]~";

    $countArgs = count($args);
    preg_match_all($pattern, $format, $expected);
    $countVariables = isset($expected[0]) ? count($expected[0]) : 0;

    if ($countArgs !== $countVariables) {
        throw new \Exception('The number of arguments in the string does not match the number of arguments in a template.');
    } else {
        return $countArgs > 1 ? vsprintf($format, $args) : sprintf($format, reset($args));
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X