2011-07-23 111 views
3

我不得不製作一個GUI,它允許我的客戶端自定義一個問候消息。他們明白他們將不得不使用%s來指示用戶名的顯示位置。但是,如果指定%s太多,sprintf將失敗,並顯示消息Too few arguments如何讓sprintf優雅地失敗?

是否有一個選項可以在字符串中保留多餘的%s實例,或者只是將它們替換爲空字符串?

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

顯然還有其他的sprintf格式模板,這些模板也應該優雅地失敗。

+0

我嘗試使用'@ sprintf'來忽略警告,但它似乎沒有做任何事情。 –

回答

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); 
+0

這不是他可能要查找的內容,也許模板字符串確實需要%s不變 – dynamic

+0

想法是捕獲無效消息,_before_它們保存在某處,至少通過第一個解決方案。 'sprintf()'很難用相同的值多次替換佔位符。這就是爲什麼我決定提供第二種解決方案的原因。 – KingCrunch

+0

如果模板字符串需要更多%s,它們不一定無效 – dynamic

3

也許使用str_replace代替?

$output = str_replace('%s', $user_name, $greeting_template); 
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'); 
0

你不這樣做,你驗證他們的輸入,以確保他們提交了一個有效的字符串

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

1

使用以下格式:

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

該解決方案將適用於我,如果有可能:'嘗試{sprintf($ bad_template,$ param); } catch(Exception $ ex){/ * handle * /}'然後我可以告訴客戶端使用其他佔位符,並在輸入自定義問候語時顯示相應的錯誤消息。 –