2010-11-16 6 views

Répondre

4

Puisque vous souhaitez rechercher et remplacer les caractères que vous pouvez le faire comme:

// function to replace every '$n'th occurrence of $find in $string with $replace. 
function NthReplace($string,$find,$replace,$n) { 
     $count = 0; 
     for($i=0;$i<strlen($string);$i++) { 
       if($string[$i] == $find) { 
         $count++; 
       } 
       if($count == $n) { 
         $string[$i] = $replace; 
         $count = 0; 
       } 
     } 
     return $string; 
} 

Ideone Link

+0

merci, et comment sur le groupe de 3 ou 5 ou ... – kelester

+0

@kelester: J'ai mis à jour mon post. – codaddict

+0

Cela échoue lorsque 'fun' est appelé pour une chaîne différente si l'appel précédent est renvoyé avec un nombre de compteur impair. Appelez juste 'preg_replace_callback ('/() /', 'fun', $ string)' deux fois de suite sur la chaîne mentionnée et vous obtenez des résultats différents. – Gumbo

6

Vous pouvez utiliser une combinaison de explode, array_chunk, array_map et implode:

$words = explode(' ', $string); 
$chunks = array_chunk($words, 2); 
$chunks = array_map(function($arr) { return implode(' ', $arr); }, $chunks); 
$str = implode(',', $chunks); 

Mais il suppose que chaque mot est séparé par un seul espace.

Une autre solution probablement plus facile est d'utiliser preg_replace comme ceci:

preg_replace('/(\S+\s+\S+)\s/', '$1,', $string) 

Le motif (\S+\s+\S+)\s correspond à toute séquence d'un ou plusieurs caractères non-blancs (\S+), suivi par un ou plusieurs caractères d'espacement (\s+) , suivi d'un ou de plusieurs caractères non blancs, suivi d'un caractère d'espace et remplace le dernier espace par une virgule. Les espaces blancs en tête seront ignorés.

Ainsi, les matches seront dans ce cas:

a b c d e f g h i 
\__/\__/\__/\__/ 

Ceux-ci sont alors remplacés comme suit:

a b,c d,e f,g h,i 
+0

+1 pour preg_replace - fonctionne parfaitement. –

1
function insertAtN($string,$find,$replace,$n) { 
     $borken = explode($find, $string); 
     $borken[($n-1)] = $borken[($n-1)].$replace; 
     return (implode($find,$borken)); 
    } 

    $string ="COMPREHENSIVE MOTORSPORT RACING INFORMATION"; 
    print insertAtN($string,' ',':',2) 
    //will print 
    //COMPREHENSIVE MOTORSPORT:RACING INFORMATION 
Questions connexes