2009-08-06 7 views
40

Je construis une expression de recherche Lucene.NET assez grande. Existe-t-il un moyen de faire le remplacement des chaînes en PHP? Cela n'a pas à être comme ça, mais j'espère quelque chose de similaire à la méthode C# String.Format.C# String.Format() Équivalent en PHP?

Voici à quoi ressemblerait la logique en C#.

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

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

Existe-t-il un équivalent PHP5?

+0

I pense que les indices de vos ficelles doivent être dans crementing, sinon il va jeter une erreur. var filter = "contenu: {0} titre: {1}^4.0 chemin.title: {2}^4.0 description: {3} ..."; –

+0

@BeowulfOF Si ma mémoire me sert bien et qu'elle ne renverrait pas d'erreur, remplacez simplement chaque occurrence de '{0}' par "Cheese" (dans l'exemple). –

Répondre

65

Vous pouvez utiliser le sprintf function:

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

Ou vous écrivez votre propre fonction pour remplacer le {i} par l'argument correspondant:

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 Vous étiez 10 secondes plus rapide! –

+0

Merci, Gumbo. Sprintf a fait l'affaire, bien qu'il semble être basé sur 1 plutôt que sur 0. En d'autres termes,% 0 $ s ne fonctionne pas mais% 1 $ s le fait. Merci encore. –

+1

+1 pour le lien + samplecode. –