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 :

[Tableaux] Traitement Wysiwyg htmlentities()+strip_tags() etc. [Tutoriel]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut [Tableaux] Traitement Wysiwyg htmlentities()+strip_tags() etc.
    Bonjour,

    Je suis à la recherche d'une fonction assez complexe qui me permettrait de traiter une chaine de texte envoyée par un éditeur wysiwyg d'un textarea.

    L'ideal serait d'avoir une fonction qui execute un htmlentities($str, ENT_QUOTES) sur toute la chaine de texte Sauf sur une série de balises autorisées et son contenu tel que par exemple
    apres avoir definit $allowedTags = '<span><b>etc....';

    <span style="font-weight: bold;">Exemple </span> <table une balise ouverte mais texte à convertir...

    Le texte en gras a été traité via htmlentities($str, ENT_QUOTES).


    Un problème rencontré parmis tant d'autres :
    Le strip_tags() supprime tout ce qui suit une balise non fermée.
    echo strip_tags('<table Bonjour...')
    // Ici rien ne s'affiche


    Voici une solution :
    Faire un htmlentites en premier et utiliser preg_replace et html_entity_decode pour remplacer les champs autorisés en normal.
    Avec un <[balise] *> quelque chose comme ca ereg( ^b|span|div+.*+>$ )
    Je ne suis pas sur du ereg mais c'est une idée

    Néanmoins, seriez vous m'orienter sur la forme du pattern pour preg_replace, et comment réaliser le html_entity_decode sur ce résultat.


    Bref cela me semble bien compliqué, si vous aviez quelques pistes ou encore mieux une fonction existante.

    Par avance, Merci

    DoR][aN

  2. #2
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Salut !
    wohhh 4h15 du mat, me v'la toujours réveillé et je me penche sur ton probleme alors que je devrait bosser sur un site parlant d'autruches
    Sur le coup, je me suis dit "hohoho trop simple", mais en y regardant de plus pret, pas tant que ca. En fait, si ca se trouve je n'ai rien compris, mais bon...
    Ce que tu veux, c'est autoriser seulement certaine balises, c'est bien ca ? bon bon bon, si c'est bien le cas, ton approche me parait la meilleure : tout transformer en entitées html pour ensuite autoriser seulement les balises admises, sinon, la persimivité du html renderait la tache bien trop complexe.
    Voilà l'approche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $txt = str_replace(array('<', '>'), array('&lt;', '&gt;'), $txt);
    $in = array (
     '(&lt;(/?span\b.*?)&gt;)i',
     '(&lt;(/?b\b.*?)&gt;)i'
    );
    $txt = preg_replace($in, '<$1>', $txt);
    Dans un 1er temps, je remplace tous les < > par leurs équivalents html, ensuite, je prepare un tableau qui contient les balises autorisées, ici <span> et <b> ... Il y a moyen de generer le tableau automatiquement avec array_map, le motif étant toujours le meme ... Et ensuite paf on regenere les balises autorisées.
    Bon, le html reservant des surprises, il y a peut-etre des choses a corriger, mais tel quel, ca parait pas trop mauvais.

  3. #3
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    Salut doof,

    Merci pour le temps que tu m'as consacré. Voila mes réactions.

    Ici y a t-il une erreur sur '(&lt;(/?span\b.*?)&gt;)i', qui serait en faite '(&lt;(/?span\span.*?)&gt;)i'.
    Si oui dommage parce que ca marchait comme ca, sinon peux tu m'expliquer comment cela fonctionne.

    Avec un exemple concret :
    <div style="text-align: center;"><span style="font-weight: bold; background-color: rgb(255, 255, 153);">Blablablablabla</span>
    </div>


    S'il n'y a pas d'erreur ds ton code alors le span est tres bien interpreté (génial) . Dans le cas contraire cela ne tourne pas :^)
    Cela me semble paradoxale car la syntaxe qui me semble bonne ne fonctionne pas et inversement.

    En essayant de la sorte plus rien ne marche
    $in = array ('(&lt;(/?span\span.*?)&gt;)i', '(&lt;(/?b\b.*?)&gt;)i', '(&lt;(/?div\div.*?)&gt;)i');

    Si ton code est bon, alors je ne vois pas quel serait la logique pour ajouter la balise div par exemple.

    De plus petit détail j'aimerais réaliser un $txt=htmlentities($str, ENT_QUOTES); avant le traitement et non pas un str_replace.
    Ce qui fait que tous mes guillemets deviennent &quot;.
    (htmlentities me sert a encoder ts les caracteres spéciaux et accentués problematiques pour linux)

    L'idéal serait bien de Faire un htmlentites en premier et utiliser preg_replace et html_entity_decode pour remplacer les champs autorisés via un masque. Mais comment :/ :D

    Merci et bon courage pour les autruches.

  4. #4
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Ok, ca donnerait donc ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $txt=htmlentities($txt, ENT_QUOTES); 
    $in = array ( 
     '(&lt;(/?span\b.*?)&gt;)ie',
     '(&lt;(/?div\b.*?)&gt;)ie',
     '(&lt;(/?b\b.*?)&gt;)ie' 
    ); 
    $txt = preg_replace($in, "'<'.html_entity_decode('$1',ENT_QUOTES).'>'", $txt);
    l'option e dans les motifs permet l'execution de html_entity_decode() dans le remplacement.

    Je t'ai rajouté le div, le \b est une assertion qui cherche une limite de mot, la balise se trouve donc ici : '(&lt;(/?span\b.*?)&gtie' . Ce qui match donc soit <span...> soit </span...>

    Est-ce que ca correspond ?

    ps : au lieu de mettre dans un tableau un motif par balise, il y a moyen de tout mettre en 1 seul motif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $in = '(&lt;(/?(?:span|div|b)\b.*?)&gt;)ie';
    donc séparés par un ou |

  5. #5
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    Re doof,

    Que te dire à part un grand merci !

    Génial, parfait, j'en tres suis content :)

    Au passage j'ajoute ceci a ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function removeEvilAttributes($tagSource) {
    	$stripAttrib = 'javascript:|onclick|ondblclick|onmousedown|onmouseup|onmouseover|'.
    					'onmousemove|onmouseout|onkeypress|onkeydown|onkeyup';
       return stripslashes(preg_replace("/$stripAttrib/i", 'forbidden', $tagSource));
    }

    Je suis certain que cette derniere peut être améliorée, néanmois tout semble marcher.


    Merci à bientôt.

  6. #6
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Si tu veux, j'avais commencé une fonction pour virer le javascript :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    function stripJS($html)
    {
     function sjs_stiptags($c)
     {
      $em = '*?= *?(["|\']).*?\\1`is';
      $jsev = array (
       "`onclick $em",
       "`onchange $em",
       "`onabort $em",
       "`onafterupdate $em",
       "`onblur $em",
       "`ondbclick $em",
       "`onerror $em",
       "`onfocus $em",
       "`onhelp $em",
       "`onkeydown $em",
       "`onkeypress $em",
       "`onkeyup $em",
       "`onload $em",
       "`onmousedown $em",
       "`onmousemove $em",
       "`onmouseout $em",
       "`onmouseover $em",
       "`onmouseup $em",
       "`onreadystatechange $em",
       "`onreset $em",
       "`onresize $em",
       "`onscroll $em",
       "`onselect $em",
       "`onsubmit $em",
       "`onunload $em"
      );
      return preg_replace($jsev, '', $c[0]);
     }
     do {
      $html = preg_replace('`<script.*</script.*>`Uis', '', $html);
     } while (preg_match('`<script.*</script.*>`Uis', $html));
     
     $html = preg_replace_callback('`<[a-zA-Z/!\?].*?>`s', 'sjs_stiptags', $html);
     return $html;
    }
    Je n'ai pas eu l'occasion de m'en servir souvent par contre.

  7. #7
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    Impec ca à l'air de tourner.

    Dans mon cas c'est surtout pour supprimer les attributs de mes balises étant donné que dans ta précédante fonction je n'autorise pas le javascript.

    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
     
    function re($txt) {
    	$txt=htmlentities($txt, ENT_QUOTES);
     
    	$balises='div|span|p|font|a|address|pre|h1|h2|h3|h4|h5|h6|ol|li|ul';	
     
    	$in='(&lt;(/?(?:'.$balises.')\b.*?)&gt;)ie';
    	$txt=preg_replace($in, "'<'.html_entity_decode('$1',ENT_QUOTES).'>'", $txt);
     
    	$txt=stripJS($txt);
     
    	$txt=str_replace('&lt;br&gt;', '<br />', $txt);
    	$txt=str_replace('&lt;br /&gt;', '<br />', $txt);
     
    	$txt=str_replace('<a href="', '<a target="_blank" href="', $txt);
    	return str_replace('&lt;hr style=&quot;width: 100%; height: 2px;&quot;&gt;', '<hr style="width:100%; height:2px;" />', $txt);
     
    }
    Il ne me reste plus que le cas de l'image à html_entity_decode.

    De <img src="http://www.google.fr/intl/fr_fr/images/logo.gif">
    à une norme Xhtml <img src="http://www.google.fr/intl/fr_fr/images/logo.gif" alt="Image" />

    début d'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $txt=preg_replace('/&lt;img\b[^"]*?&gt;/ies', 'html_entity_decode("\0")', $txt);
    Merci pour ton aide précieuse.
    En une journée j'ai gagné un temps fou.

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

Discussions similaires

  1. [Tableaux] traitement de texte
    Par speedev dans le forum Langage
    Réponses: 22
    Dernier message: 28/06/2006, 17h06
  2. [Tableaux] <¿ traitement de checkbox ¿>
    Par artotal dans le forum Langage
    Réponses: 1
    Dernier message: 14/06/2006, 08h52
  3. [Tableaux] Traitement d'un tableau
    Par espadon1 dans le forum Langage
    Réponses: 13
    Dernier message: 16/05/2006, 15h20
  4. [Tableaux] Traitement d'un tableau
    Par flocokal dans le forum Langage
    Réponses: 1
    Dernier message: 13/04/2006, 13h20
  5. Réponses: 2
    Dernier message: 28/02/2006, 12h52

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