2009-08-06 14 views
40

Oldukça geniş bir Lucene.NET arama ifadesi yapıyorum. PHP'de string değiştirme işlemini yapmanın en iyi yöntemleri var mı? Bu şekilde olmak zorunda değil, ama C# String.Format yöntemine benzer bir şey umuyorum.C# String.Format() PHP'de Eşdeğer mi?

Mantık C# 'de nasıl görünecektir.

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

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

PHP5 eşdeğeri var mı?

+0

ben Dize yer tutucularınızın indekslerinin olması gerektiğini düşünün crementing, başka bir hata atacaktır. var filter = "content: {0} başlık: {1}^4.0 path.title: {2}^4.0 açıklaması: {3} ..."; –

+0

@BeowulfOF Belleğim bana bir hata yapmazsa iyi hizmet ediyorsa, yalnızca "{0}" ile "Peynir" arasındaki her örneği değiştirin (örnekte). –

cevap

65

Şunları kullanabilirsiniz sprintf function:

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

Yoksa karşılık gelen argüman tarafından {i} yerine kendi işlevi yazın:

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 saniye daha hızlıdın! –

+0

Teşekkürler, Gumbo. Sprintf hile yaptı, ancak 0 tabanlı olmak yerine 1 tabanlı görünüyor. Diğer bir deyişle,% 0 $ s çalışmadı, ancak% 1 $ s çalışıyor. Tekrar teşekkürler. Bağlantı + örnek kod için –

+1

+1. –