Bu nasıl vsprintf kontrol çalıştırmadan önce argüman doğru numarası vardır

1 Cevap php

I vsprintf () çıktı biçimlendirilmiş bir dize kullanmaya çalışıyorum, ama ben "Çok az argümanlar" hataları önlemek için çalıştırmadan önce argümanların doğru sayıda olduğunu doğrulamak gerekir.

Özünde ben ne ihtiyacım türü belirteçleri sayısını saymak için bir regex olduğunu düşünüyorum, ama regex için geldiğinde oldukça yararsız ve ben bu yüzden ben SO bir gitmek vermek düşündüm yerde finanse edemez. :)

Eğer daha iyi bir şekilde düşünebilirsiniz sürece bu yöntem ne istiyorum çizgisinde olduğunu.

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

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

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

}

Eğer basit bir şekilde düşünüyorum eğer söyle lütfen.

1 Cevap

Ben çözüm daha fazla veya daha az güvenilir bir dize kaç argüman anlatmak için tek yol olduğunu düşünüyorum.

İşte ben ile geldi düzenli ifade ile bunu kullanmak preg_match_all():

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

sprintf() belgelerine dayanarak . Should be compatible with PHP 4.0.6+ / 5.


EDIT - Biraz daha kompakt bir versiyonu:

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

Ayrıca, func_get_args() yararlanmak ve kodunuzda func_num_args() fonksiyonları.


EDIT: - pozisyonel / takas argümanları desteklemek için güncellendi (not tested):

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')));