2010-11-17 5 views
2

Disons que vous avez une chaîne comme:Suppression d'une duplication d'une variable dans une chaîne?

$string = 'hello my name is blah blah and wats yours'; 

Et vous vouliez passer et vérifier tous les endroits où il pourrait y avoir un double emploi .. pas d'un mot, mais juste du mot choisi dans ce cas ' blabla'.

$variable = 'blah'; 

Soit, si 'bla' apparaît dos à dos - en supprimer un. Je considère la division de la chaîne en tableau et si une variable du tableau commence par le même mot, la dernière se termine par en couper une et reconstruire la chaîne. Cela semble tedius alors c'est pourquoi je demande s'il pourrait y avoir un moyen plus simple.

Des idées? Edit: je viens de réaliser que je n'ai pas envisagé de faire un preg_match de simplement 'bla bla' avec 'bla'.

Répondre

3

Que diriez-vous ceci:

$string = 'hello my name is blah blah and wats yours'; 
$variable = 'blah'; 
$string = preg_replace('/(\b'.$variable.'\s+){2,}/' , '\1' , $string); 

Permet de plus d'une variable à manipuler (vous pouvez soit une boucle à travers un certain nombre de $variable s ou vous pouvez créer un tableau d'entre eux et utiliser un seul preg_replace() appel .

Ou tout simplement utiliser un str_replace()

$string = 'hello my name is blah blah and wats yours'; 
$variable = 'blah'; 
$string = str_replace($variable.' '.$variable.' ' , $variable.' ' , $string); 
+0

solution de Nice avec regex /('.$variable.'\s+){2,}/ – Zeemee

+0

Vous réel Je l'ai cloué avec simplicité ici. – willdanceforfun

+0

Vous devriez faire 'preg_quote' sur la variable, par souci de stabilité, bien que ce ne soit pas nécessaire pour' blah'. En outre, cela ne correspondra pas 'bla bla.', car il faut un espace blanc après les deux mots. – lonesomeday

1
$string = 'hello my name is blah blah and wats yours'; 
$search_string = 'blah'; 

$first_occurence = strpos($string , $search_string); 

If (int preg_match($search_string , $string) > 1) { 
    echo "String found more than once!!!"; 

    // remove all occurences of searchstring from string excepte the first one 
    $string = substr ($string, 0, $first_occurence +1) . str_replace($search_string, '', substr ($string,$first_occurence +1)); 
} 
1

Vous pouvez vérifier la position de chaque occurence de la variable $ en $ string, et vérifier si les positions de plusieurs occurences diffère seulement dans la longueur de la variable $ (peut-être + espaces blancs).

1

Toutes les réponses à ce jour parlent de toute duplication du mot dans la chaîne. Je pense que vous cherchez uniquement à supprimer les mots identiques consécutifs. Vous pouvez le faire avec preg_replace:

$string = 'hello my name is blah blah and wats yours'; 

$string = preg_replace('/\b(\w+)(\s+)\\1\s*/', '\\1\\2', $string); 

Notez que cette fonction est assez stupide, et ainsi enlèverez des phrases valides comme « avait eu ». Vous pourriez probablement contourner cela en utilisant une liste blanche et preg_replace_callback. Il suffit de relire votre question et vous avez précédemment manqué le mot "mots spécifiés seulement". Vous pouvez le faire avec une liste noire des mots qui ne doivent pas être dupliqué:

$string = 'hello my name is blah blah and wats yours. I had had a bad day'; 

$string = preg_replace_callback('/\b(\w+)(\s+)\\1\s*/i', function($matches) { 
    $blacklist = array ('blah'); 

    if (in_array(strtolower($matches[1]), $blacklist)) { 
     return $matches[1] . $matches[2]; 
    } else { 
     return $matches[0]; 
    } 
}, $string); 

// $string == "hello my name is blah and wats yours. I had had a bad day" 

Vous pouvez ajouter plus d'un mot au tableau $blacklist.

Questions connexes