如何使sprintf优雅地失败?

时间:2011-07-23 16:15:54

标签: php

我必须制作一个GUI,允许我的客户自定义问候语。他们知道他们必须使用%s来指示用户名的显示位置。但是,当指定了太多%s sprintf时,消息Too few arguments失败。

是否可以选择在字符串中保留多余的%s实例,或者只用空字符串替换它们?

// $greeting_template === 'Welcome to our site %s. Broken: %s'
$output = sprintf($greeting_template, $user_name);

显然还有其他sprintf格式化模板,那些也应该优雅地失败。

5 个答案:

答案 0 :(得分:3)

也许使用str_replace代替?

$output = str_replace('%s', $user_name, $greeting_template);

答案 1 :(得分:3)

您应该确保消息模板有效,而不是修复损坏的模板

if (substr_count($greeting_template, '%s') > 1)
  throw new Exception('Too many placeholders');

substr_count()

或者您切换到完全自己的字符串模板格式,如

$greeting_template = 'Welcome to our site {username}. Broken: {username}';
$replacements = array('{username}' => $username);
$message = str_replace(
              array_keys($replacements),
              array_values($replacements), 
              $greeting_template);

答案 2 :(得分:1)

您可以制作自己的sprintf版本。

function sprintf2(){ // untested
 $args=func_get_args();
 $template=array_shift($args);
 return str_replace( '%s', $args, $template );
}

使用它像:

sprintf2('your template %s. Other %s untouched','User123');

答案 3 :(得分:1)

使用以下格式:

$greeting_template === 'Welcome to our site %1$s. Broken: %1$s';

答案 4 :(得分:0)

您没有,您验证他们的输入以确保他们提交了有效的字符串

if(substr_count($greeting_template, '%s') > 1) { //handle error }