2009-08-06 17 views
40

Sto costruendo un'espressione di ricerca Lucene.NET piuttosto grande. Esiste un modo migliore per fare la sostituzione delle stringhe in PHP? Non deve essere in questo modo, ma spero in qualcosa di simile al metodo C# String.Format.C# String.Format() Equivalente in PHP?

Ecco come si presenta la logica in C#.

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

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

Esiste un equivalente PHP5?

+0

I pensa che gli indici dei tuoi segnapagina devono essere presenti crementando, altrimenti genererà un errore. var filter = "content: {0} title: {1}^4.0 path.title: {2}^4.0 description: {3} ..."; –

+0

@BeowulfOF Se la mia memoria mi serve bene che non genera un errore, basta sostituire ogni istanza di '{0}' di "Cheese" (nell'esempio). –

risposta

65

È possibile utilizzare il sprintf function:

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

O si scrive la propria funzione di sostituire il {i} dal corrispondente argomento:

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 Eri 10 secondi più veloce! –

+0

Grazie, Gumbo. Sprintf ha fatto il trucco, anche se sembra essere basato su 1 anziché su 0. In altre parole,% 0 $ s non ha funzionato, ma% 1 $ s sì. Grazie ancora. –

+1

+1 per link + samplecode. –