我试图使用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')));