php - 如何在运行前检查 vsprintf 是否具有正确数量的参数

标签 php regex printf

我正在尝试使用 vsprintf() 来输出格式化字符串,但我需要在运行它之前验证我的参数数量是否正确,以防止出现“参数太少”错误。

本质上我认为我需要的是一个正则表达式来计算类型说明符的数量,但是当涉及到正则表达式时我很没用而且我无法在任何地方资助它所以我想我会试一试. :)

除非您能想到更好的方法,否则此方法符合我的要求。

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

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

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

}

如果你能想到更简单的方法,请告诉我。

最佳答案

我认为您的解决方案是或多或少可靠地判断字符串中有多少参数的唯一方法。

这是我想出的正则表达式,将它与 preg_match_all() 一起使用:

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

基于 sprintf() documentation .应与 PHP 4.0.6+/5 兼容。


编辑 - 一个稍微更紧凑的版本:

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

另外,在代码中利用 func_get_args()func_num_args() 函数。


编辑: - 已更新以支持位置/交换参数(未测试):

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

关于php - 如何在运行前检查 vsprintf 是否具有正确数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2053664/

相关文章:

php - 根据用户在提交之前输入的文本框(数字)值对表格进行排序

javascript - 如何找到与特定正则表达式匹配的字符串?

c - C如何在printf语句中编译 "senthil"“kumar”?

php - 如何找到所有东西而不是一个词

php - 除了一些针以外,用 preg_replace 屏蔽所有字符

c - 在预处理器指令中包装 C printf() 调用

c - 在 C 中打印 float ,同时避免将可变参数提升为 double

php - woocommerce_product_thumbnails Hook 现在贬值了吗?什么是解决方法?

php - 服务器端图像大小调整性能

php - 停止 WordPress 从 301 重定向/index.php 到/