PHP > Besoin d'aide pour un bout de code

gcvoiron
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 494
Inscription: 19 Oct 2005

PHP > Besoin d'aide pour un bout de code

Message le Mer Fév 07, 2007 22:51

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 [url]et[/url].
La chaine de caractère s'appelle $chaine. Il faudrait en fait faire :
Code: Tout sélectionner
$chaine= str_replace("Mot11", "Mot22", $chaine);

si ce n'est pas entre [url]et[/url].

Auriez-vous des idées ?

Merci.


k2pi
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 313
Inscription: 4 Fév 2007

Message le Mer Fév 07, 2007 22:57

Tu fais une variable $tag_url = false; et des que tu rencontres une balise [url]tu la passe a true et tu la remet a false lorsque tu rencontre[/url]

en fonction de ca tu actives ou non le str_replace.

gcvoiron
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 494
Inscription: 19 Oct 2005

Message le Mer Fév 07, 2007 23:00

Ok merci, mais pour savoir qu'il y a balise [URL], comment faire ?
Une boucle for avec :
Code: Tout sélectionner
"$chaine[$i]$chaine[$i+1]$chaine[$i+2]$chaine[$i+3]$chaine[$i+4]"=="[URL]"

?
J'ai essayé mais en vain...


lupuz
WRInaute discret
WRInaute discret
 
Messages: 212
Inscription: 15 Mar 2006

Message le Mer Fév 07, 2007 23:33

Regarde du côter de la fonction ereg_replace.
http://www.php.net/ereg_replace

La Chaise sauvage
WRInaute impliqué
WRInaute impliqué
 
Messages: 717
Inscription: 11 Avr 2005

Message le Jeu Fév 08, 2007 9:34

sinon, je ne garantis pas l'efficacité pour de gros volumes de texte, mais cette solution fonctionne :


Code: Tout sélectionner
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: Tout sélectionner
$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 [url]ceci est un test[/url] blabla test youpi ceci est un test youpi [url]ceci est un test[/url] blabla test youpi
Phrase produite : ceci est un ok youpi [url]ceci est un test[/url] blabla ok youpi ceci est un ok youpi [url]ceci est un test[/url] 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
Dernière édition par La Chaise sauvage le Jeu Fév 08, 2007 9:53, édité 1 fois.


HawkEye
WRInaute accro
WRInaute accro
 
Messages: 17005
Inscription: 23 Fév 2004

Message le Jeu Fév 08, 2007 9:52

Il faut aussi tenir compte des liens ancrés:

Code: Tout sélectionner
[url=url]text[/url]

La Chaise sauvage
WRInaute impliqué
WRInaute impliqué
 
Messages: 717
Inscription: 11 Avr 2005

Message le Jeu Fév 08, 2007 10:04

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: Tout sélectionner
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;
}


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités