[Javascript] Regex
Fermé
heavymac
Messages postés
11
Date d'inscription
jeudi 16 novembre 2006
Statut
Membre
Dernière intervention
29 novembre 2006
-
28 nov. 2006 à 15:17
slooptoo - 29 nov. 2006 à 12:24
slooptoo - 29 nov. 2006 à 12:24
A voir également:
- [Javascript] Regex
- Telecharger javascript - Télécharger - Langages
- Regex tiret - Forum Webmastering
- Afficher un tableau javascript en html ✓ - Forum Javascript
- Node.js javascript runtime virus ✓ - Forum Virus
- Regex ne contient pas ✓ - Forum Programmation
4 réponses
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
28 nov. 2006 à 15:26
28 nov. 2006 à 15:26
Mais il y a plus simple:
Quand tu reçois le contenu d'un champ de l'utilisateur, tu échappe les caractères HTML.
(La plupart des langages possèdent cette fonction).
Exemple:
< sera transformé en & lt;
& sera transformé en & amp;
etc.
Comme ça, aucun moyen s'utiliser la moindre balise HTML.
Mais au moins ça permettra à ceux qui participent au forum de parler de code HTML sans se faire censurer..
Quand tu reçois le contenu d'un champ de l'utilisateur, tu échappe les caractères HTML.
(La plupart des langages possèdent cette fonction).
Exemple:
< sera transformé en & lt;
& sera transformé en & amp;
etc.
Comme ça, aucun moyen s'utiliser la moindre balise HTML.
Mais au moins ça permettra à ceux qui participent au forum de parler de code HTML sans se faire censurer..
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
28 nov. 2006 à 15:49
28 nov. 2006 à 15:49
Dans ce cas, tu peux faire une regexp de remplacement avec une callback
(La fonction est appellée pour chaque occurence de la chaîne, et c'est la fonction qui fourni la chaîne de remplacement).
C'est plus souple.
ça permet de l'exprimer plus facilement dans ta fonction.
(Je ne me rappelle plus de la syntaxe).
Hé... une minute. Tu parles de Javascript ?
Rassures-moi: Tu t'assure bien aussi côté serveur qu'il ne reste aucune balise HTML, hein ?
(La fonction est appellée pour chaque occurence de la chaîne, et c'est la fonction qui fourni la chaîne de remplacement).
C'est plus souple.
ça permet de l'exprimer plus facilement dans ta fonction.
(Je ne me rappelle plus de la syntaxe).
Hé... une minute. Tu parles de Javascript ?
Rassures-moi: Tu t'assure bien aussi côté serveur qu'il ne reste aucune balise HTML, hein ?
Ssylvainsab
Messages postés
2884
Date d'inscription
samedi 29 juillet 2006
Statut
Modérateur
Dernière intervention
15 août 2020
825
28 nov. 2006 à 17:42
28 nov. 2006 à 17:42
Salut.
Je suis globalement d'accord avec sebsauvage.
Surtout :
Hé... une minute. Tu parles de Javascript ?
Rassures-moi: Tu t'assure bien aussi côté serveur qu'il ne reste aucune balise HTML, hein ?
Il y a mille moyens de contourner JS et un formulaire ;)
Sinon, je te suggère une solution qui me parait simple :
(a faire sur le seveur)
-un htmlentities ou htmlspecialchars (voir php les ressemblances a ne pas confondre pour choisir).
-tu remplaces les balises spécifiques au bbcode ou a ton code :
-Tu remplaces les balises autorisées :
C'est vria qu'on pourrait quand même avoir besoin d'un preg_replace_callback (ce que cite sebsauvage) pour vérifier qu'il n'y pas n'importe quels attributs (je pense a onclik, et tout ce que l'on peut faire en JS)
a plus
Je suis globalement d'accord avec sebsauvage.
Surtout :
Hé... une minute. Tu parles de Javascript ?
Rassures-moi: Tu t'assure bien aussi côté serveur qu'il ne reste aucune balise HTML, hein ?
Il y a mille moyens de contourner JS et un formulaire ;)
Sinon, je te suggère une solution qui me parait simple :
(a faire sur le seveur)
-un htmlentities ou htmlspecialchars (voir php les ressemblances a ne pas confondre pour choisir).
-tu remplaces les balises spécifiques au bbcode ou a ton code :
$message=preg_replace('#<(b|gras)>(.+)</\1>#U','<b>$2</b>',$message);
-Tu remplaces les balises autorisées :
$message=preg_replace('#<(a|div|etc...)>(.+)</\1>#sU','<$1>$2</$1>',$message);
C'est vria qu'on pourrait quand même avoir besoin d'un preg_replace_callback (ce que cite sebsauvage) pour vérifier qu'il n'y pas n'importe quels attributs (je pense a onclik, et tout ce que l'on peut faire en JS)
a plus
heavymac
Messages postés
11
Date d'inscription
jeudi 16 novembre 2006
Statut
Membre
Dernière intervention
29 novembre 2006
29 nov. 2006 à 11:16
29 nov. 2006 à 11:16
Hé... une minute. Tu parles de Javascript ?
Rassures-moi: Tu t'assure bien aussi côté serveur qu'il ne reste aucune balise HTML, hein ?
Il y a mille moyens de contourner JS et un formulaire ;)
Je sais bien que le JS présente un certain nombre de failles mais, à partir du moment où tu vires toutes les balises HTML (dont la balise "script") niveau client... et que tu fais effectivement un autre check niveau serveur, je pense que le risque est quand même limité non ?
En fait, je voudrais juste savoir s'il y a moyen de parvenir à mes fins via une seule Regex en Javascript ou s'il faut obligatoirement que je contourne le problème via le genre de solution que tu m'as proposée.
Car quand tu me dis que faire :
En fait, ta solution va bien dans le cas d'un parser BBCode par exemple (remplacer des balises personnalisées par des balises HTML) mais ce n'est pas ce que je veux (ne garder que certaines balises HTML)... d'autant que je connais déjà les Regex et que j'avais déjà écarté ta solution.
Je n'aurais pas posé la question si j'avais voulu faire un simple parser... chose que je sais déjà faire depuis longtemps.
C'est pour ça que j'aurais aimé trouvé une Regex qui me supprime toutes les balises HTML non autorisées (et leur contenu) pour ne pas avoir à me trouver avec un mélange de balises entre < et >
Un truc du genre :
Comme ça tu te retrouves avec un texte propre direct...
Donc existe t-il ce genre de Regex en Javascript car en php, suffirait d'utiliser la fonction strip_tags() avec en 2nd paramètre les balises à ne pas supprimer.
Rassures-moi: Tu t'assure bien aussi côté serveur qu'il ne reste aucune balise HTML, hein ?
Il y a mille moyens de contourner JS et un formulaire ;)
Je sais bien que le JS présente un certain nombre de failles mais, à partir du moment où tu vires toutes les balises HTML (dont la balise "script") niveau client... et que tu fais effectivement un autre check niveau serveur, je pense que le risque est quand même limité non ?
En fait, je voudrais juste savoir s'il y a moyen de parvenir à mes fins via une seule Regex en Javascript ou s'il faut obligatoirement que je contourne le problème via le genre de solution que tu m'as proposée.
Car quand tu me dis que faire :
$message=preg_replace('#<(b|gras)>(.+)</\1>#U','<b>$2</b>',$message);Je vois mal comment tu fais pour virer (avant ou après) toutes les autres balises HTML (ie non autorisées) de ton texte... puisque tu ne te retrouves qu'avec des balises HTML, ie balise entre < et >.
En fait, ta solution va bien dans le cas d'un parser BBCode par exemple (remplacer des balises personnalisées par des balises HTML) mais ce n'est pas ce que je veux (ne garder que certaines balises HTML)... d'autant que je connais déjà les Regex et que j'avais déjà écarté ta solution.
Je n'aurais pas posé la question si j'avais voulu faire un simple parser... chose que je sais déjà faire depuis longtemps.
C'est pour ça que j'aurais aimé trouvé une Regex qui me supprime toutes les balises HTML non autorisées (et leur contenu) pour ne pas avoir à me trouver avec un mélange de balises entre < et >
Un truc du genre :
/</?[^b][^>]*>/gimais qui marche avec toutes les balises autorisées.
Comme ça tu te retrouves avec un texte propre direct...
Donc existe t-il ce genre de Regex en Javascript car en php, suffirait d'utiliser la fonction strip_tags() avec en 2nd paramètre les balises à ne pas supprimer.
pas simple a faire vu que les expressions regulieres n aiment pas trop la logique negative
il y a une solution peu elegante cependant si vraiment vraiment tu veux le faire :
str.replace(/<(\/?([bui]|code))>/gi, "glop{$1}").replace(/<\/?[^>]+>/gi, "").replace(/glop{([^}]+)}/gi, "<$1>")
tu auras compris le principe... si l utilsateur commence a mettre du glop{} dans son texte ca ne marchera pas
il y a une solution peu elegante cependant si vraiment vraiment tu veux le faire :
str.replace(/<(\/?([bui]|code))>/gi, "glop{$1}").replace(/<\/?[^>]+>/gi, "").replace(/glop{([^}]+)}/gi, "<$1>")
tu auras compris le principe... si l utilsateur commence a mettre du glop{} dans son texte ca ne marchera pas
28 nov. 2006 à 15:40
>> S'il est vrai que le but de ma Regex est ne pas pouvoir utiliser de balises HTML, n'oublie pas que je veux tout de même permettre l'usage de certaines d'entre elles !
Mais au moins ça permettra à ceux qui participent au forum de parler de code HTML sans se faire censurer.
>> Ce n'est pas particulièrement pour un site de programmation et donc je ne vois pas l'utilité de pouvoir "parler" de code HTML.
En fait, je veux faire exactement la même chose que sur ce site : éliminer toutes les balises HTML sauf certaines balises qui sont également délimitées avec < et >