2009-08-06 19 views
40

かなり大きなLucene.NET検索式を構築しています。 PHPで文字列置換を行うベストプラクティスの方法はありますか?このようにする必要はありませんが、私はC#String.Formatメソッドに似た何かを期待しています。C#String.Format()PHPに相当しますか?

これは、C#でのロジックの外観です。

var filter = "content:{0} title:{0}^4.0 path.title:{0}^4.0 description:{0} ..."; 

filter = String.Format(filter, "Cheese"); 

PHP5相当品はありますか?

+0

I文字列プレースホルダのインデックスはそれ以外の場合はエラーが発生します。 var filter = "内容:{0}タイトル:{1}^4.0 path.title:{2}^4.0 description:{3} ..."; –

+0

@BeulfulfOF私の記憶がうまくいけばエラーは出ないでしょうが、 '{0}'のすべてのインスタンスを "Cheese"(この例では)に置き換えてください。 –

答えて

65

あなたは使用することができsprintf function

$filter = "content:%1$s title:%1$s^4.0 path.title:%1$s^4.0 description:%1$s ..."; 
$filter = sprintf($filter, "Cheese"); 

それとも、対応する引数によって{i}を置き換えるために、独自の関数を書く:

function format() { 
    $args = func_get_args(); 
    if (count($args) == 0) { 
     return; 
    } 
    if (count($args) == 1) { 
     return $args[0]; 
    } 
    $str = array_shift($args); 
    $str = preg_replace_callback('/\\{(0|[1-9]\\d*)\\}/', create_function('$match', '$args = '.var_export($args, true).'; return isset($args[$match[1]]) ? $args[$match[1]] : $match[0];'), $str); 
    return $str; 
} 
+3

+1 10秒ほど速かった! –

+0

ありがとう、Gumbo。 Sprintfはトリックを行いましたが、0ベースではなく1ベースのようです。つまり、%0 $ sは機能しませんでしたが、%1 $ sは機能しませんでした。再度、感謝します。 –

+1

リンク+サンプルコード+1。 –

関連する問題