2008-08-26 21 views
11

Python a cette merveilleuse façon de gérer les substitutions de chaînes à l'aide de dictionnaires:Est-ce que PHP a un équivalent à ce type de substitution de chaîne Python?

>>> 'The %(site)s site %(adj)s because it %(adj)s' % {'site':'Stackoverflow', 'adj':'rocks'} 
'The Stackoverflow site rocks because it rocks' 

J'adore parce que vous pouvez spécifier une valeur, une fois dans le dictionnaire, puis le remplacer dans tous les sens dans la chaîne.

J'ai essayé de réaliser quelque chose de similaire en PHP en utilisant différentes fonctions de remplacement de chaîne, mais tout ce que j'ai trouvé est gênant.

Quelqu'un a-t-il une manière propre et agréable de faire ce genre de substitution de chaînes en PHP?

Modifier
est ici le code de la page sprintf que je préférais.

<?php 

function sprintf3($str, $vars, $char = '%') 
{ 
    $tmp = array(); 
    foreach($vars as $k => $v) 
    { 
     $tmp[$char . $k . $char] = $v; 
    } 
    return str_replace(array_keys($tmp), array_values($tmp), $str); 
} 

echo sprintf3('The %site% site %adj% because it %adj%', array('site'=>'Stackoverflow', 'adj'=>'rocks')); 
?> 
+0

Le les solutions de contournement suggérées ici doivent être considérées comme une réponse «Non» à la question dans le PO. Jusqu'à présent, aucun d'entre eux ne semble répliquer la fonctionnalité de Python, et il y a des bogues identifiés explicitement partout. – dreftymac

Répondre

5
function subst($str, $dict){ 
    return preg_replace(array_map(create_function('$a', 'return "/%\\($a\\)s/";'), array_keys($dict)), array_values($dict), $str); 
} 

Vous l'appelez comme ceci:

echo subst('The %(site)s site %(adj)s because it %(adj)s', array('site'=>'Stackoverflow', 'adj'=>'rocks')); 
4

@Marius

Je ne sais pas s'il est plus rapide, mais vous pouvez le faire sans regexes:

function subst($str, $dict) 
{ 
    foreach ($dict AS $key, $value) 
    { 
    $str = str_replace($key, $value, $str); 
    } 

    return $str; 
}