我正在尝试使用 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/