2009-08-06 14 views
40

Buduję dość duży wyrażeń wyszukiwania Lucene.NET. Czy istnieje najlepszy sposób na zastąpienie ciągu w PHP? Nie musi tak być, ale mam nadzieję na coś podobnego do metody C# String.Format.C# String.Format() Równoważne w PHP?

Oto, jak logika będzie wyglądać w języku C#.

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

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

Czy istnieje odpowiednik PHP5?

+0

I myślę, że muszą być indeksy twoich elementów zastępczych Kreacja, inaczej spowoduje błąd. var filter = "content: {0} title: {1}^4.0 path.title: {2}^4.0 description: {3} ..."; –

+0

@BeowulfOF Jeśli moja pamięć dobrze mi służy, że nie wyrzuci błędu, wystarczy zastąpić każdą instancję '{0}' przez "Ser" (w przykładzie). –

Odpowiedz

65

można użyć sprintf function:

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

Albo napisać własną funkcję, aby zastąpić {i} przez odpowiedniego argumentu:

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 Byłeś o 10 sekund szybszy! –

+0

Dzięki, Gumbo. Sprintf zrobił lewę, choć wydaje się, że opiera się na 1, a nie na 0. Innymi słowy,% 0 $ s nie działało, ale% 1 $ s robi. Dzięki jeszcze raz. –

+1

+1 dla linku + kod samplera. –