我必须制作一个GUI,允许我的客户自定义问候语。他们知道他们必须使用%s来指示用户名的显示位置。但是,当指定了太多%s sprintf
时,消息Too few arguments
失败。
是否可以选择在字符串中保留多余的%s实例,或者只用空字符串替换它们?
// $greeting_template === 'Welcome to our site %s. Broken: %s'
$output = sprintf($greeting_template, $user_name);
显然还有其他sprintf格式化模板,那些也应该优雅地失败。
答案 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');
或者您切换到完全自己的字符串模板格式,如
$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 }