IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Epurer les balises HTML [RegEx]


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Epurer les balises HTML
    Bonjour à tous,

    Peut-être que ce sujet a déjà été évoqué, mais je n'ai rien trouvé.

    Voilà, je voudrais m'assurer au maximum que la saisie utilisateur ne contienne pas de code malveillant pour certains formulaires, je n'ai donc autorisé que certaines balises grâce à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strip_tags($text, '<p><b><i><u><ul><li><em><span><br><br /><hr>')
    .

    Maintenant, même en faisant ceci, il n'est pas impossible que dans ma balise <p> par exemple, j'ai un onClick par exemple. C'est ce genre de chose que j'aimerais éviter et donc je voudrais que les balises que j'ai autorisé soient épurées de tous les attributs.

    Seulement j'ai beau chercher et essayer je n'arrive pas à trouver la bonne expression qui me permettrait de faire ça ... en plus je suis pas super à l'aise avec les expressions alors j'y arrive vraiment pas. J'ai essayé plein de choses et la dernière en date c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('#<p(.)*>#','<p>',$text);
    (bon là j'ai mis pour la balise P car je voulais déjà m'assurer d'y arriver pour une balise avant d'aller plus loin).

    D'avance merci pour votre aide !!

  2. #2
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    Tu peux essayer cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('#<p[^>]*>#','<p>',$text);
    Qui signifie : tout ce qui commence par <p, puis qui est suivit de 0 ou plusieurs caractères différents du >, et qui se termine par >/
    Z.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merciiiiiiii beaucoup à toi !! avec l'explication en plus pour être sure d'avoir bien compris, c'est parfait, ça marche bien.

    Et quand on regarde la solution comme ça, ça a l'air tellement simple ... ça m'ait même pas venu à l'esprit d'interdire des caractères plutôt que de tout autoriser ...

    Par contre, pour continuer là dessus, j'aimerais savoir s'il est possible de simplifier les choses de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $allowed_tags = array('p','b','i','u','ul','li','em','span','br','hr');
     
    $mask ='/<$élément_du_tableau[^>]*>/i'; //élément_du_tableau est récupéré de $allowed_tags
    En fait, si j'ai un tableau des balises autorisées, est-ce possible de récupérer chaque élément du tableau pour construire le masque qui correspondrait bien et le remplacer par la balise correspondant également ?

    En fait c'est juste pour savoir si je dois faire directement "en dur" un masque pour chaque balise ... Je sais qu'on peut faire des tableaux de correspondances entre les masques et les chaînes de remplacement, mais moi je veux savoir si on peut rendre la saisie du masque "plus simple".

    Merci d'avance

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Salut,

    Ca peut se faire, comme ça par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $str = "<p class='foo'> <span id='bar'>hello world</span> </p>";
     
    $tags = array('p', 'span');
     
    $reg = sprintf("#<(%s)[^>]*>#i", implode('|', $tags));
     
    echo preg_replace($reg, '<$1>', $str);
    Mais vu que tu n'as déjà gardé que les balises qui te convenait, tu peux aussi faire plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $str = "<p class='foo'> <span id='bar'>hello world</span> </p>";
     
    $reg = '/<(\w+)[^>]+>/i';
     
    echo preg_replace($reg, '<$1>', $str);

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ok, merci je vais tester ça.

    Par contre j'ai regardé dans la doc pour m'assurer de bien comprendre, j'ai bien compris le \w qui est très logique car je fais déjà une épuration juste avant pour garder les balises souhaitées.

    Par contre j'ai rien trouvé sur le <$1>, ou ce que j'ai pu trouver je ne le comprend pas (en tout cas ça correspond pas à ce que tu fais). Pourrais-tu m'expliquer à quoi cela correspond ou me donner un lien vers la doc correspondante, ce serait super sympa, car juste recopier c'est bof quand même

    merci d'avance !

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Le $1 correspond tout simplement à ce qui est attrapé par la première parenthèse capturante.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je dois pas être correctement réveillée je crois car je suis pas sure d'avoir compris désolée.
    En gros, le $1 va récupérer ce qui est retourné par mon \w+ ?

    Ce que tu appelles "première parenthèse capturante", c'est les premières parenthèses de mon masque ? Donc si j'en ai une autre dans mon masque, je peux l'appeler par $2 ?

    [EDIT]
    En fait, ça marche super bien, mais je suis trop bête, je ne peux pas utiliser ce que tu m'as dit de faire, car ça ne marche pas tout le temps.
    Par exemple, j'autorise les balises <u> mais aussi <ul> et du coup ben avec ce masque, tous les ul sont transformés en u, donc je crois que je n'ai pas le choix que d'y écrire en dur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    '/<u[^>l]*>/i' //pour les <u> 
    '/<ul[^>]*>/i' // pour les <ul>
    Dernière modification par Invité ; 09/02/2010 à 10h15.

  8. #8
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Exact !

    Comme quoi, tu es bien réveillée finalement...

  9. #9
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par poopsinou Voir le message
    En fait, ça marche super bien, mais je suis trop bête, je ne peux pas utiliser ce que tu m'as dit de faire, car ça ne marche pas tout le temps.
    Par exemple, j'autorise les balises <u> mais aussi <ul> et du coup ben avec ce masque, tous les ul sont transformés en u, donc je crois que je n'ai pas le choix que d'y écrire en dur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    '/<u[^>l]*>/i' //pour les <u> 
    '/<ul[^>]*>/i' // pour les <ul>
    Bah si ça marche, et je le prouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $str = "<ul class='foo'> <li><u>hello world</u></li> </ul>";
     
    $reg = '/<(\w+)[^>]+>/i';
     
    echo preg_replace($reg, '<$1>', $str);

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bon ben je dois être folle alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <?php
    	function verify_input_text($text)
    	{	 
    		$text = strip_tags($text, '<p><b><i><u><ul><li><em><span><br><br /><hr>');		
     
    		$tags_masks ='/<(\w+)[^>]+>/i';
     
    		$text = preg_replace($tags_masks, '<$1>', $text);		
     
    		return($text);
    	}
     
    	echo '<H3>Test</H3>';
     
    	echo '<FORM action="#" method="post">';
    		echo '<TEXTAREA name="texte_poste"></TEXTAREA>';
    		echo '<INPUT type="submit" value="Valider" />';
    	echo '</FORM>';
     
    	if(isset($_POST['texte_poste']) && $_POST['texte_poste']!='')
    	{
    		echo 'Texte saisi après épuration :<br />'.verify_input_text($_POST['texte_poste']);
    	}
    ?>
    Texte entré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    essai <P onClick="javascript:alert(1);"><ul><li>d'un texte</li></ul></P> épuré.
    Texte en sorti :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    essai <P><u><l>d'un texte</li></ul></P> épuré.
    Ca marche pas chez moi

    [EDIT]
    En fait ça marche si les balises sont à épurer, si elles sont justes ça marche plus !
    Par exemple, dans ton exemple à toi le ul ressort bien en ul mais le li est transformé en l si tu regardes le code source de la page.

  11. #11
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par poopsinou Voir le message
    Par exemple, dans ton exemple à toi le ul ressort bien en ul mais le li est transformé en l si tu regardes le code source de la page.
    Ben voilà, il suffisait de le dire que je n'avais pas non plus les yeurx en face des trous.
    Et la solution est oversimple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $str = "<ul class='foo'> <li><u>hello world</u></li> </ul>";
     
    $reg = '/<(\w++)[^>]*>/i';
     
    echo preg_replace($reg, '<$1>', $str);

  12. #12
    Invité
    Invité(e)
    Par défaut
    Non mais ça arrive de passer à côté d'un truc ...

    Alors pour toi c'est peut-être super simple, mais là tu m'a perdue !!

    La doc dit :
    + Quantificateur de 1 ou plus
    Bon ok donc un + veut dire 1 ou plus déjà, alors c'est quoi ce 2° + ??

    Jme demande si je lis la bonne doc moi

  13. #13
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Ca marche aussi avec un seul "+", et tu peux virer le deuxième qui est un quantificateur possessif. Je l'ai mis pour deux raisons : les perfs et une histoire de backtracking qui relève des regex "avancées", aussi je ne développerais pas.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bon avec les deux "+", ça marche ce coup-ci.

    Par contre j'ai pas vraiment compris mais pas grave (j'ai qu'à chercher le pourquoi du comment et je finirais bien par comprendre ), tu m'a déjà bien aidé donc je vais passer le sujet en résolu.

    Merci beaucoup et bonne journée !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mettre les balises HTML quand il faut
    Par v4np13 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 15/05/2006, 10h02
  2. [RegEx] Supprimer les balises HTML
    Par hisy dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2006, 17h10
  3. Script pour enlever les balises html
    Par Scratch48 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 02/11/2005, 17h16
  4. [XSL] conserver les balises html
    Par krappa dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/07/2005, 15h14
  5. forcer xsl à interpréter les balises html
    Par canal68 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/07/2005, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo