Expressions régulières pour la suppression de balises

[Résolu]
Signaler
Messages postés
68
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
6 février 2008
-
Messages postés
68
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
6 février 2008
-
J'ai fait un module de template transformant tout ce qui se trouve entre {} par la variable équivalente.

Si la variable n'est pas trouvées, alors, on supprime dans le template les {} à l'aide d'une expression régulière ($texte = preg_replace('/{[^ \t\r\n}]+}/', "", $texte); )

Mais voilà, tout les scripts javascript contenant des {} sautent aussi (exemple function check(){ alert('oui'); } devient function check() )

Alors j'essaye mais en vain d'exclure de la première expression régulière tout ce qui se trouve entre les balises <script> et </script>

// l expression ci dessous retire les balises scripts mais je ne parviens pas à faire la fonction qui permet de ne pas y modifier
$search = array ('@{.*?}@si', '@<script.*?</script>@si');
$texte = preg_replace($search, array('', ''), $texte);

Merci d'avance à celui qui pourra m'aider

4 réponses

Messages postés
68
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
6 février 2008

Bon j'ai résolu mon problème et donne la solution pour ceux que ça pourrait interesser:

Quand une variable entre accolade dans mon template n'était pas renseignée, alors je la virais. Pour ça je remplaçais ce qui se trouvait entre accolade par rien :
$texte = preg_replace('@{.*?}@si', '', $texte );

alors pour garder le javascript, il fallait que je garde toutes les variables dont les accolades étaient suivies d'un retour à la ligne ou d'un espace :
{MAVAR} <- Variable de template
{
MAVAR
} ou { MAVAR } <- a garder tel quel

Pour ça j'ai utilisé l'expression :
$texte= preg_replace('/{[^ \t\r\n}]+}/', "", $texte);
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Et oui, et oui...



C'est le grand malheur des expressions régulières, elles ne gèrent pas
l'exculsion dune chaine complète. (ou si qq'un sait comment faire, je
suis preneur !!!)





Donc il faut feinter...



J'ai bien une méthode pour recréer cette fonctionnalité, mais le plus
simple serait de savoir par quoi sont identifiables les variable de tes
templates.



Par exemple, si tu les encadres avec : , il sera facile de les re-trouver...



'/{:[\S]+:}/'



=> connais-tu le \S qui veut dire "tout ce qui n'est pas un caractère blanc", soit : [^\n\r\t ] (et d'autres caractères)





Sinon, je peux te donner une piste pour recréer ton exclusion, mais
t'es mal barré car le javascript ne se trouve pas seulement entre des
balise <script>



ex : onclick=""



puis il y'a aussi le CSS enligne qui à des accolades...

Bref, je trouve que tu as mal choisi tes {} pour encadrer tes variables de templates...
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Change les démarquations de tes variables par autre chose... ça serait plus simple non... genre <{ma_var}> ou %ma_var%... enfin... ce que j'en dis... .. . ;o)

@ tchaOo°
Messages postés
68
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
6 février 2008

En fait, il n'y a que des fonctions (pour les onclick , cela génère la fonction automatiquent et pour les style, c'est tout dans une css a part qui ne passe pas par le template).

J'ai mis d'autres caractères à la places des accolades, mais mon system de template gèrent les boucles et donc lors de l'execution du template mes délimiteurs (<%| |%>) sont remplacés par { }. Une fois sorti de la boucle, le contenu généré est parfois réappeler dans d'autres boucles et la je retombe sur le meme probleme.

Je ne vois alors comme solution d'exclure toutes les { } avec des retours chariots dedans, mais la je sèche aussi.