2011-07-23 6 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

考えられるのは、少なくとも最初の解決策によって、無効なメッセージを捕まえることです。 'sprintf()'は、プレースホルダを同じ値で複数回置き換えるのを困難にします。その理由は、なぜ私は2番目のソリューションを提供することにしたのですか? – 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 * /} '代わりのプレースホルダを使用するようにクライアントに指示し、カスタム挨拶の入力時に適切なエラーメッセージを表示することができます。 –

関連する問題