2010-10-21 10 views
4

En supposant que j'ai une chaîneremplacer les mêmes caractères avec des chaînes différentes

$str = "abc*efg*hij*"; 

et un tableau

$arr = array("123","456","789"); 

Maintenant, je veux remplacer les * s en $str avec les éléments en $arr selon la Le premier * remplacé par $arr[0], le second remplacé par $arr[1] etc. Je vérifie la fonction str_replace, bien qu'il accepte des tableaux comme paramètres mais Je l'ai trouvé ne work.And je ne peux utiliser

$newstr = "abc{$arr[0]}efg{$arr[1]}hij{$arr[2]}" 

parce que le vrai $str peut être tout à fait longue chaîne avec beaucoup de bonnes idées * .Tout? Merci.

Répondre

11

Si * est votre personnage de format seulement, essayez de le convertir *-%s (aussi échapper existant %-%%), puis en utilisant vsprintf(), qui prend un tableau de valeurs pour passer en tant que paramètres de format:

$str = str_replace(array('%', '*'), array('%%', '%s'), $str); 
$newstr = vsprintf($str, $arr); 
echo $newstr; 

sortie:

abc123efg456hij789 

Notez que si vous avez plus d'éléments du tableau que astérisques, les éléments supplémentaires à la fin tout simplement pas apparaître dans la chaîne. Si vous avez plus d'astérisques que d'éléments de tableau, vsprintf() émettra un avertissement de trop-peu d'arguments et renverra false.

1

Vous pouvez toujours juste garder les choses simples avec preg_replace() et utiliser l'argument $limit, comme ceci:

for($i = 0; $i < count($arr); $i++) 
    $str = preg_replace('/\*/', $arr[$i], $str, 1); 

mais à cause de l'aspect pratique, @ la réponse de BoltClock est le meilleur choix car il a) ne comporte pas une boucle, mais plus important encore b) n'est pas obligé d'utiliser une expression régulière.

+0

Bonne solution.J'ai juste l'intention de l'exploser puis de combiner les pièces, ce qui n'est évidemment pas une bonne idée :) – Young