2011-08-13 4 views

Répondre

8

Vous pouvez utiliser vsprintf:

vsprintf("This is a %s %s.", array("test", "phrase")); // "This is a test phrase." 

Si vous n'avez, puis remplacer le? pour% s:

$str = "This is a ? ?."; 
vsprintf(str_replace("?", "%s", $str), array("test", "phrase")); 
+0

L'OP a demandé: "Comment puis-je remplacer plusieurs occurrences d'un caractère unique * * avec un tableau de variables?". 'vsprintf' sert à remplacer les spécificateurs de format (qui sont au moins deux caractères, dont'% '). –

+1

@Delan Azabani: il n'est pas si difficile de remplacer tout '?' Par '% s' avant d'obtenir exactement' Ceci est un% s% s .' chaîne – zerkms

+0

Merci pour vsprintf. Défiant la réponse la plus simple. – ATLChris

1

Que diriez-vous ceci:

$str = 'This is a ? ?.'; 

$replacement = array('test', 'phrase'); 

foreach ($replacement as $word) { 
    if (($pos = strpos($str, '?')) !== false) { 
     $str = substr_replace($str, $word, $pos, 1); 
    } 
} 

var_dump($str); 

Running sample on ideone.com

3

est ici une solution très concise:

$in = 'This is a ? ?.'; 
$ar = array('test', 'phrase'); 
foreach ($ar as $rep) 
    $in = implode($rep, explode('?', $in, 2)); 

$in est maintenant la dernière chaîne.

Commentaires:

  • s'il y a plus de points d'interrogation que les éléments du tableau, les marques en excès question restent
  • s'il y a plus d'éléments de tableau que points d'interrogation, seuls ceux nécessaires seront utilisés
  • à mettre un point d'interrogation dans votre chaîne finale, mettre une substitution '?' dans votre tableau

Exemple: http://codepad.org/TKeubNFJ

2

Allons, comment est-il difficile d'écrire une fonction qui fonctionne toujours? Toutes les réponses affichées à ce jour donnera des résultats incorrects pour la chaîne d'entrée suivantes et les valeurs de remplacement:

$in="This i%s my ? input ? string"; 
$replace=array("jo%shn?",3); 

Un problème souvent négligé est que si vous changez la chaîne d'entrée, les valeurs de remplacement contenant le motif d'entrée d'origine peut-être remplacé à nouveau. Pour résoudre ce problème, vous devez créer une nouvelle chaîne. En outre, les solutions sprintf font l'hypothèse (peut-être incorrecte) que la chaîne d'entrée ne contient jamais '% s'. L'affiche originale n'a jamais dit que c'était le cas, donc '% s' devrait être laissé seul.

Essayez plutôt cette fonction. Ce n'est peut-être pas la solution la plus rapide et la plus élégante, mais au moins cela donne des résultats de sortie raisonnables (ahum) indépendamment de l'entrée.

function replace_questionmarks($in,$replace) 
{ 
    $out=""; 
    $x=0; 
    foreach (explode("?",$in) as $part) 
    { 
     $out.=$part; 
     $out.=$replace[$x++]; 
    } 
    return $out; 
} 

$in="This i%s my ? input ? string"; 
$replace=array("jo%shn?",3); 
print replace_questionmarks($in,$replace); 

Sortie:

This i%s my jo%shn? input 3 string 
Questions connexes