Aller au contenu

Remplacer tout ce qui n'EST PAS entre <balise>...</balise>


Sujets conseillés

Posté

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 ! ;)

Posté

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 :)

Posté (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 page
echo 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é par BaZouL
Posté

Ca se complique :smartass:

Vérifier d'abord combien de <textarea> tu as avant, faire un tableau où tu stockes les élements ?

Patrick

Posté (modifié)

Oui :wacko:

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é par BaZouL
Posté

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 ;)

Posté (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 page
echo 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é par BaZouL
Posté

Il y a <pre> et tout élément (bloc) auquel tu aurais appliqué la propriété CSS suivante :

white-space: pre;

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...