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 :

htmlspecialchars & htmlentities


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut htmlspecialchars & htmlentities
    Bonjour,

    il s'agit au fait d'un truc tout simple!
    ce bout de code source ne marche pas, savez vous pk???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
    echo $new; // &lt;a href='test'&gt;Test&lt;/a&gt;
    ?>
    ce code m'affiche : <a href='test'>Test</a>
    idem pour htmlentities, j'ai recopier l'exemple de php.net et ca marche pas!!

    je m'arrache les cheveux!!

    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Citation Envoyé par redah75 Voir le message
    ce code m'affiche : <a href='test'>Test</a>
    Je suppose que tu veux dire que ton navigateur t'affiche ça ?
    Si c'est bien ça, c'est normal, et c'est l'objectif. Pour voir ce qui est envoyé par ton script php, tu dois regarder la source de ta page.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    merci pour ta réponse,
    Oui, c est le résultat que mon navigateur m affiche, je v verifier la source...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    ah oui, tu as raison, je n'y avais pas pense
    et si je veux que ca soit visible en tant que resultat sur la navigateur, comment pourrais je faire?

  5. #5
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par redah75 Voir le message
    ah oui, tu as raison, je n'y avais pas pense
    et si je veux que ca soit visible en tant que resultat sur la navigateur, comment pourrais je faire?
    Tu le fais deux fois !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    OK!

    et une derniere question stp:
    apres l'utilisation de la fonction, les simples cotes sont transformees en & #039; (sans espace) mais mon navigateur me la transforme automatiquement en '
    comment faire pour qu'il me garde & #039; comme il le fait pour &quot;

    j utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    htmlspecialchars($ma_chaine, ENT_QUOTES)

  7. #7
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    C'est bien l'objectif des fonctions htmlspecialchars et htmlentities ! Petit extrait de la doc php :
    Certains caractères ont des significations spéciales en HTML, et doivent être remplacés par des entités HTML pour être affichés. htmlspecialchars() remplace tous ces caractères par leur équivalent dans la chaîne string . Cette conversion est très pratique pour la programmation web. Si vous devez remplacer tous les caractères, utilisez plutôt htmlentities() à la place.

    htmlspecialchars() est pratique pour éviter que des données fournies par les utilisateurs contiennent des balises HTML, comme pour un forum ou un chat.
    Le caractère '<' par exemple est remplacé par '&lt;', pour que le navigateur ne considère pas qu'il s'agit d'une ouverture de balise mais affiche bien '<' (en interprétant '&lt;').

    Si tu veux afficher une chaîne qui contiens '<' dans le navigateur telle qu'elle serait transformée par htmlspecialchars, il faut appliquer deux fois cette fonction : une fois pour convertir le caractère '<' en '&lt;' (qui serait affiché '<' par le navigateur), et une seconde fois pour convertir le caractère '&' en '&amp;' (pour que le navigateur n'interprète plus '&lt;' mais l'affiche...).

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    merci pour cette explication detaillee

    quand tu me dis d'utiliser 2 fois cette fonction, faut il faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    htmlspecialchars(htmlspecialchars($chaine, , ENT_QUOTES))
    ?

    et si j'ai par exemple &amp;#039; comment faire pour afficher ' ??

    merci beaucoup

  9. #9
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par redah75 Voir le message
    quand tu me dis d'utiliser 2 fois cette fonction, faut il faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    htmlspecialchars(htmlspecialchars($chaine, , ENT_QUOTES))
    ?
    Oui c'est bien ça...

    Citation Envoyé par redah75 Voir le message
    et si j'ai par exemple &amp;#039; comment faire pour afficher ' ??
    Qu'est ce que c'est que ces magouilles... Pourquoi as-tu besoin à ce point de décoder / encoder tes chaînes de caractères ?

    Pour répondre à la question : html_entity_decode

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    Qu'est ce que c'est que ces magouilles... Pourquoi as-tu besoin à ce point de décoder / encoder tes chaînes de caractères ?
    Hehe, j'en ai besoin pour transmettre des valeur ds une fonction javascript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var valeur = "<a href=\"document.getElementById('id_champ').value = '" + val + "';\">mon lien</a>"
    où val peut etre une chaine du genre : l'avenir de "Blablablaba"
    val est le resultats d'une recherche generee en PHP & Ajax

    puisque un addslashes() ne fait pas l'affaire, je suis oblige de convertir ces foutus cotes et double cotes..

    Je suis preneur si tu as une autre solution

    Merci

  11. #11
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Si j'ai bien compris, c'est au résultat récupéré dans val que tu fais subir le traitement des htmlentities... Et ce que tu veux, c'est uniquement un échappement des guillemets simples et doubles ?

    Pourquoi dis-tu que addslashes() ne fait pas l'affaire ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    voila ce qui ne va pas avec addslashes() :

    dison que val est : l'avenir de "Blablablaba"
    donc si je fais un addslashes() avant, val devient : l\'avenir de \"Blablablaba\"
    le premier \" sera alors interprete comme la fermeture de ce qui est en gras dans la syntaxe suivante :
    var valeur = "<a href=\"document.getElementById('id_champ').value = '" + val + "';\">mon lien</a>";

    je ne vois vrmt pas comment contourner ce probleme!!

  13. #13
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par redah75 Voir le message
    dison que val est : l'avenir de "Blablablaba"
    donc si je fais un addslashes() avant, val devient : l\'avenir de \"Blablablaba\"
    le premier \" sera alors interprete comme la fermeture de ce qui est en gras dans la syntaxe suivante :
    var valeur = "<a href=\"document.getElementById('id_champ').value = '" + val + "';\">mon lien</a>";
    Non, \" n'est pas une ouverture de guillemet. '\' est un caractère d'échappement qui permet de signaler à javacript qu'il faut prendre le caractère suivant littéralement et pas l'interpréter.

    quand tu fais var valeur = "blabla\"blabla", au final valeur contiens la chaîne blabla"blabla (sans \ donc).

    Enfin, je ne vois pas quel problème te pose addslashes. L'as-tu essayé ?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    oui, je l'ai essaye et ca marche pas. je m'explique mieux!!

    concretement, j'aurai la syntaxe suivante :

    var valeur = "<a href=\"document.getElementById('id_champ').value = 'l\'avenir de \"Blablablaba\"';\">mon lien</a>";

    les guillemets rouges se ferment avec les rouges qui suivent
    les guillemets bleus se fermeront avec les oranges au lieu des bleus et cela n'est pas bon!!

    j'espere que tu comprends mieux mon probleme mnt

  15. #15
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Non, je ne comprend pas mieux ton problème, et me demandes si tu as vraiment testé addslashes

    Parce que l'équivalent serait la syntaxe suivante, et non celle que tu as donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var valeur = "<a href=\"document.getElementById('id_champ').value = 'l\\\'avenir de \\\"Blablablaba\\\"';\">mon lien</a>";

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    pk 3 back slashes ???

    j'ai une requete sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sel = mysql_query("SELECT titre FROM ....");
    while($sel = mysql_fetch-array($sel))
    {
      $test = addslashes($res[titre]);
    }
    on est bien d'accord que echo $test va m'afficher l\'avenir de \"Blablablaba\" ???


    je vais retester tt de suite addslashes et te tiens au courant

  17. #17
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Oui, ça affichera bien ça.

    Pour les 3 \, c'est simplement que le caractère \ doit être échappé (donc 2 \) et que le guillemet qui suit l'est aussi (1 \ en plus).

    Imaginons que val contienne bla\"bla. Une constante équivalente de val serait "bla\\\"bla"...

    Ou pour reprendre une partie de ton code, après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var valeur = "<a href=\"document";
    valeur contiendra la chaîne <a href="document et pas la chaîne <a href=\"document !

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    OK pour les 3 \, je comprends mieux mnt

    franchement ca m'ennerve cette histoire de guillemets et la javascript aussi!! je ne sais plus quoi dire/faire!

    pour resumer:
    var valeur = "<a href=\"form...value = '" + val + "';\">lien</a>";
    comment dois etre val sachant qu'elle peut contenir des " et des ' ???

  19. #19
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Oups, en fait je viens de me rendre compte que pour ton problème j'avais zappé un élément : en HTML, le caractère \ n'est pas un caractère d'échappement, d'où l'inutilité de addslashes.

    La solution est probablement de remplacer " par &quot; et ' par \'.

    Le mieux est probablement de ne pas le faire en php mais plutôt en javascript avec replace, quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var reg=new RegExp('"', "g");
    val = val.replace(reg, '&quot;');
    reg=new RegExp("'", "g");
    val = val.replace(reg, "\\'");
    var valeur = "<a href=\"document.getElementById('id_champ').value = '" + val + "';\">mon lien</a>"

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    tu vois, je t'avais dit que addslashes ne fonctionne pas dans mon cas

    t'es un geni, ta solution marche bien
    j'avais trouve une solution mais plus complique :
    ds ma page php je fais un htmlspecialchars(htmlspecialchars($results, ENT_QUOTES));

    puis en javascript je fais un str_replace(['&amp;amp;', '&amp;quot;', '&amp;#039;'], ['&', '"', '\''], line[1])...
    enfin tu vois la galere

    ta solution est bp plus simple, mais g pas suivi tes conseils a la lettre, j'ai en php mis: str_replace(array("'", "\""), array("\'", "&quot;"), $results);

    je rajoute une derniere question stp:
    etant donne ques les simples et doubles cotes causent enorment de prob, quel est le meilleur moyen de gerer les formulaires de saisi??
    c'est a dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <form action="verif.php"...>
    <input type="text" value="<? echo $nom; ?>" length...>
    ...
    </form>
    ds la page verif.php, que faut il faire pour afficher $nom sachant que $nom peut contenir des " et ' ?
    et puis si on retourne sur le formulaire, comment afficher $nom dans le champ nom avec les " et ' ???

    Merci merci merci mille fois

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/01/2010, 18h35
  2. htmlspecialchars, addslashes, htmlentities et autres
    Par senacle dans le forum Langage
    Réponses: 4
    Dernier message: 16/06/2008, 22h25
  3. htmlentities et htmlspecialchars entités numériques
    Par Invité dans le forum Langage
    Réponses: 1
    Dernier message: 25/03/2007, 13h40
  4. [Smarty] Problème sous Smarty : htmlspecialchars ou htmlentities
    Par harlock59 dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 12/05/2006, 15h57
  5. Réponses: 7
    Dernier message: 24/09/2005, 14h30

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