PHP > Besoin d'aide pour un bout de code

WRInaute occasionnel
Bonjour,

J'aurai besoin d'idées pour mettre en place un bout de code en PHP.
Je voudrai en fait remplacer des mots par d'autres dans mon forum, sauf si ils se trouvent entre les balises et.
La chaine de caractère s'appelle $chaine. Il faudrait en fait faire :
Code:
$chaine= str_replace("Mot11", "Mot22", $chaine);
si ce n'est pas entre et.

Auriez-vous des idées ?

Merci.
 
WRInaute occasionnel
Ok merci, mais pour savoir qu'il y a balise , comment faire ? Une boucle for a...URL]" [/code] ? J'ai essayé mais en vain...
 
WRInaute impliqué
sinon, je ne garantis pas l'efficacité pour de gros volumes de texte, mais cette solution fonctionne :


Code:
function gcvoiron_replace($cherche,$remplace,$chaine){
	$flag = TRUE;
	$tab = explode(' ',$chaine);
	$i=0;
	foreach($tab as $mot){
		if($flag){
			if(strpos(strtolower($mot),'[url]') !== FALSE) {
				$flag = FALSE;
			} else {
				$mot = str_replace($cherche,$remplace,$mot);
			}
		}
		if(strpos(strtolower($mot),'[/url]') !== FALSE) {
			$flag = TRUE;
		}
		$res .= $mot.' ';
		$i++;
	}
	return $res;
}

ce qui s'utilise évidemment comme ceci :

Code:
$string = "ceci est un test youpi [url]ceci est un test[/url] blabla test youpi ceci est un test youpi [URL] ceci est un test [/URL] blabla test youpi";

$ok = gcvoiron_replace('test','ok',$string);

echo 'Phrase initiale : '.$string;
echo '<br/>Phrase produite : '.$ok;

Et le résultat :

Phrase initiale : ceci est un test youpi ceci est un test blabla test youpi ceci est un test youpi ceci est un test blabla test youpi
Phrase produite : ceci est un ok youpi ceci est un test blabla ok youpi ceci est un ok youpi ceci est un test blabla ok youpi


Evidemment, si quelqu'un a des conseils quant à a l'optimisation de ceci, je suis preneur, c'est du vite fait 8)



edit : moui... ma fonction a quelques problèmes... notamment quand le mot recherché est en majuscules, ou quand il est collé à une balise ouvrante ou fermante... enfin bref c'est du bricolage, quoi
 
WRInaute impliqué
une deuxième solution, qui corrige certains des bugs que je viens de relever (mais pas le point évoqué par hawkeye)

par contre là c'est sûr, il y a de la place pour optimiser (les regex, c'est pas trop mon point fort...) je vais aller vaquer à mes occupations... et je le laisse à titre d'exercice pour les suivants

:lol:

Code:
function gcvoiron_replace($cherche, $remplace, $chaine, $b='url'){
   $chaine = preg_replace('#\['.$b.'\]#i','['.strtolower($b).']',$chaine);  // passe les balises recherchees en minuscule
   $chaine = preg_replace('#\[\/'.$b.'\]#i','[/'.strtolower($b).']',$chaine);
   $chaine = str_replace('['.$b.']',' ['.$b.']',$chaine);	// rajoute un espace avant
   $chaine = str_replace('[/'.$b.']','[/'.$b.'] ',$chaine);  // et après les balises recherchees
   $flag = TRUE;
   $tab  = explode(' ',$chaine);
   $i    = 0;
   foreach($tab as $mot){
      if($flag){
         if(strpos(strtolower($mot),'['.$b.']') !== FALSE) {
            $flag = FALSE;
         } else {
            $mot = preg_replace('#'.$cherche.'#i',$remplace,$mot);
         }
      }
      if(strpos(strtolower($mot),'[/'.$b.']') !== FALSE) {
         $flag = TRUE;
      }
      $res .= $mot.' ';
      $i++;
   }
   return $res;
}
 
Discussions similaires
Haut