2010-12-01 27 views
0

Salut à tous j'ai besoin d'un type particulier de chaîne remplacer en PHP. Je dois remplacer un mot par deux autres mots différents. Par exemple: dans la chaîne "Salut maman, salut papa" j'ai besoin de remplacer automatiquement le mot "salut" par deux autres différents, par exemple "marie" et "jean". Donc s'il n'y a qu'une seule occurrence de "Salut" elle remplace seulement par "marie" mais s'il y en a plus d'une, elle utilise toute l'association de mots.chaîne remplacer php - un mot à plus de mots

Donc, un mot de plus remplace en fonction du nombre de fois que l'occurrence du mot. Merci à tous ceux qui peuvent m'aider!

+0

Une question, permet de dire que vous avez obtenu « Salut maman, salut papa , Salut Grampa "serait-il recommencer avec Mary et John ou serait-ce Peter? – Trufa

Répondre

3

preg_replace_callback vous permet de contrôler chaque remplacement.

+1

Ceci est la solution à votre problème si vous me demandez, jetez un oeil à mon exemple pour voir une version de travail de ce que vous cherchez. (+1) – Michael

0

Vous pouvez accomplir cela avec plusieurs appels à preg_replace, en spécifiant une limite de 1 pour chaque appel:

$string = "Hi mom, hi dad"; 

preg_replace('/hi/i', 'mary', $str, 1); // "mary mom, hi dad" 
preg_replace('/hi/i', 'john', $str, 1); // "mary mom, john dad" 

Vous pouvez généraliser cela avec quelque chose comme ce qui suit. Il faut un sujet, un motif et un ou plusieurs mots de remplacement.

function replace_each($subject, $pattern, $replacement) { 

    $count = 0; 
    for ($i = 2; $i < func_num_args(); ++$i) { 
    $replacement = func_get_arg($i); 
    $subject = preg_replace($pattern, $replacement, $subject, 1, $count); 
    if (!$count) 
     // no more matches 
     break; 
    } 
    return $subject; 
} 

$string = preg_replace_each("Hi mom, hi dad", "/hi/i", "mary", "john"); 

echo $string; // "mary mom, john dad" 
0

preg_replace_callback est une façon, une autre est d'utiliser $ limites et paramètres $ count de preg_replace (voir manpage)

$str = "hi foo hi bar hi baz hi quux"; 
$repl = array('uno', 'dos', 'tres'); 

do{ 
    $str = preg_replace('~hi~', $repl[0], $str, 1, $count); 
    $repl[] = array_shift($repl); // rotate the array 
} while($count > 0);  
0

Je ne sais pas s'il y a un moyen très facile de le faire mais jetez un oeil à ce morceau de code que je viens d'écrire. Cela devrait faire l'affaire pour vous :)

<?php 
class myReplace{ 
    public $replacements = array(); 
    protected $counter = 0; 

    public function __construct($replacements) { 
     // fill the array with replacements 
     $this->replacements = $replacements; 
    } 

    public function test($matches) { 
     // if you want you could do something funky to the matches array here 

     // if the key does not exists we are gonna start from the first 
     // array element again. 
     if(!array_key_exists($this->counter, $this->replacements)) { 
     $this->counter = 0; 
     } 

     // this will return your replacement. 
     return $this->replacements[$this->counter++]; 
    } 
} 

// Instantiate your class here, and insert all your replacements in sequence 
$obj = new myReplace(array('a', 'b')); 

// Lets start the replacement :) 
echo preg_replace_callback(
    "/hi/i", 
    array($obj, 'test'), 
    "Hi mom, hi dad, hi son, hi someone"   
); 
?> 

Ce code se traduira par: une maman, papa b, un fils, b quelqu'un