2009-08-06 21 views
40

Estoy construyendo una expresión de búsqueda bastante grande de Lucene.NET. ¿Existe una forma de mejores prácticas para hacer el reemplazo de cadenas en PHP? No tiene por qué ser así, pero espero algo similar al método C# String.Format.C# String.Format() ¿Equivalente en PHP?

Así es como se vería la lógica en C#.

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

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

¿Hay un equivalente en PHP5?

+0

I cree que los índices de sus marcadores de posición de cadena deben estar en crementing, de lo contrario arrojará un error. var filter = "contenido: {0} título: {1}^4.0 path.title: {2}^4.0 descripción: {3} ..."; –

+0

@BeowulfOF Si mi memoria me sirve para no arrojar un error, simplemente sustituya cada instancia de '{0}' por "Queso" (en el ejemplo). –

Respuesta

65

Se podría utilizar el 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 usted escribe su propia función para reemplazar el {i} por el argumento correspondiente:

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 ¡Usted fue 10 segundos más rápido! –

+0

Gracias, Gumbo. Sprintf hizo el truco, aunque parece estar basado en 1 en lugar de basado en 0. En otras palabras,% 0 $ s no funcionó, pero% 1 $ s sí. Gracias de nuevo. –

+1

+1 para enlace + código de ejemplo. –