2009-08-06 68 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

我認爲你的字符串佔位符的索引必須在crementing,否則會拋出錯誤。 var filter =「content:{0} title:{1}^4.0 path.title:{2}^4.0 description:{3} ...」; – 2009-08-06 20:48:15

+0

@BeowulfOF如果我的記憶對我很好,不會拋出錯誤,只需用「Cheese」(在示例中)替換「{0}」的每個實例即可。 – 2013-10-27 12:10:17

回答

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秒! – 2009-08-06 20:26:58

+0

謝謝,Gumbo。 Sprintf做到了這一點,雖然它似乎是基於1而不是基於0的。換句話說,%0 $ s不起作用,但%1 $ s卻起作用。再次感謝。 – 2009-08-06 20:43:03

+1

+1鏈接+樣本代碼。 – 2009-08-06 20:49:03