BaZouL Posté 31 Mai 2006 Posté 31 Mai 2006 Bonsoir à tous ! Voilà, j'ai un petit problème d'expressions régulières... il faudrait vraiment que j'apprenne à bien m'en servir... (d'ailleurs si quelqu'un a des tutos ou des cours la-dessus, c'est pas de refus !) Alors voici mon problème, en gros : J'ai une variable $monSite qui contient tout le code XHTML qui va être envoyé au navigateur pour l'affichage du site. Imaginons que j'ai besoin de remplacer deux mots par un nouveau mot dans cette variable $monSite avant de l'afficher, je fais donc : echo str_replace(array('mot1','mot2'), 'mot3', $monSite); Seulement, je voudrais que mot1 et mot2 soient remplacés par mot3 partout, SAUF lorsqu'ils sont entre les balises <textarea> et </textarea> (par exemple). Voilà pourquoi j'ai besoin des expressions régulières je pense. Merci d'avance pour vos réponses !
objectifweb Posté 1 Juin 2006 Posté 1 Juin 2006 Bonjour, Une petite pirouette peut-être Extraire le contenu entre textarea dans une variable ... Remplacer ce contenu par une balise à toi ... Faire ton autre routine habituelle remplacer ta balise par l'ancien contenu du textearea ? C'est pas très "expressions régulières" mais bon ... Amicalement Patrick EDIT : Pas besoin de citer tout le post
BaZouL Posté 1 Juin 2006 Auteur Posté 1 Juin 2006 (modifié) Pas bête ! Merci J'ai essayé un truc, ça marche mais j'ai un autre problème. Voici mon code : function optimiseSite($afficheSite) { // $afficheSite contient tout le code XHTML de la page $textarea = array(); $i=0; while (ereg("<textarea(.+)</textarea>",$afficheSite,$out)) { $textarea[$i] = $out[0]; $afficheSite = ereg_replace("<textarea(.+)</textarea>","<montextarea>",$afficheSite); $i++; } $afficheSite = str_replace(array("\n","\t","\r"), '', $afficheSite); $i=0; while (ereg("<montextarea>",$afficheSite,$out)) { $afficheSite = ereg_replace("<montextarea>",$textarea[$i],$afficheSite); $i++; } return $afficheSite;}// Pour afficher la pageecho optimiseSite($afficheSite); Lorsqu'il n'y a qu'un seul <textarea ...>...</textarea> dans $afficheSite, ça marche impec: $textarea[0] contient bien quelque chose du genre : <textarea ...>mon texte</textarea> Mon problème survient lorsqu'il y a plusieurs <textarea ...>...</textarea> dans $afficheSite : $textarea[0] contient alors quelque chose comme (si il y a 2 <textarea> par exemple): <textarea ...>mon texte</textarea>du code xhtml...<textarea ...>mon texte 2</textarea> Et $textarea[1] ne contient rien. Alors que normalement, $textarea[0] devrait contenir : <textarea ...>mon texte</textarea> Et $textarea[1] : <textarea ...>mon texte 2</textarea> J'espère que j'ai été assez clair, c'est pas évident à expliquer Voilà ! Une idée pour corriger mon problème ? Merci Modifié 1 Juin 2006 par BaZouL
objectifweb Posté 1 Juin 2006 Posté 1 Juin 2006 Ca se complique Vérifier d'abord combien de <textarea> tu as avant, faire un tableau où tu stockes les élements ? Patrick
BaZouL Posté 1 Juin 2006 Auteur Posté 1 Juin 2006 (modifié) Oui Justement c'est ce que je pensais avoir fait avec ma première boucle (stocker les éléments), non ? $i=0;// tant qu'il y a des <textarea...>...</textarea>while (ereg("<textarea(.+)</textarea>",$afficheSite,$out)) { // je stocke chaque <textarea...>...</textarea> dans le tableau $textarea $textarea[$i] = $out[0]; // maintenant que c'est stocké, je remplace les <textarea...>...</textarea> par une balise <montextarea> $afficheSite = ereg_replace("<textarea(.+)</textarea>","<montextarea>",$afficheSite); $i++;} ( et pour le nombre de <textarea...>...</textarea> : count($textarea) ) Mais ça ne fonctionne pas dès qu'il y a plusieurs <textarea...>...</textarea> Modifié 1 Juin 2006 par BaZouL
TheRec Posté 1 Juin 2006 Posté 1 Juin 2006 Bonjour, c'est justement ce genre d'expression qui requièrent l'utilisation des expressions rationnelles PCRE (compatibles Perl). Ce problème de balises a été traité, par mes soins, dans ce sujet éplinglé. Par défaut, le moteur d'expression régulière est en mode "gourmand", il regarde au plus large...avec l'option PCRE_UNGREEDY tu modifies ce comportement... une expression du type : $afficheSite = preg_replace("/<textarea>(.*)<\/textarea>/smiU", "ta chaine de remplacement", $afficheSite); En règle générale, utilise les expressions rationnelles PCRE (preg_*) à la place des expressions rationnelles POSIX (ereg_*). Elles sont plus performantes dans la majorité des cas. Tu as la liste des options et de la syntaxe dans le manuel PHP. Bonne continuation dans tes expressions rationnelles
BaZouL Posté 1 Juin 2006 Auteur Posté 1 Juin 2006 (modifié) Merci beaucoup pour toutes ces précisions ! C'est parfait ! Tout marche parfaitement maintenant : function optimiseSite($afficheSite) { // $afficheSite contient tout le code XHTML de la page $textarea = array(); $i=0; while (preg_match("/<textarea(.*)<\/textarea>/smiU",$afficheSite,$out)) { $textarea[$i] = $out[0]; $afficheSite = preg_replace("/<textarea(.*)<\/textarea>/smiU", "<montextarea>", $afficheSite, 1); $i++; } $afficheSite = str_replace(array("\n","\t","\r"), '', $afficheSite); $i=0; while (preg_match("/<montextarea>/smiU",$afficheSite)) { $afficheSite = preg_replace("/<montextarea>/smiU", $textarea[$i], $afficheSite, 1); $i++; } return $afficheSite;}// Pour afficher la pageecho optimiseSite($afficheSite); Encore merci à vous tous ! Ah oui et tant que j'y pense : N'y a-t-il pas d'autres balises html comme <textarea>, où l'on a besoin de garder les retours à la ligne et les tabulations (\n,\r et \t) pour l'affichage ? Modifié 1 Juin 2006 par BaZouL
TheRec Posté 1 Juin 2006 Posté 1 Juin 2006 Il y a <pre> et tout élément (bloc) auquel tu aurais appliqué la propriété CSS suivante : white-space: pre;
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant