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

JavaScript Discussion :

Envoi d'une chaine contenant un \n à une alerte javascript


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 59
    Points : 47
    Points
    47
    Par défaut Envoi d'une chaine contenant un \n à une alerte javascript
    Bonsoir,

    J'ai une page php de contact, avec formulaire contenant un textarea.

    Cette page envoie le contenu du champ textarea à une autre page qui se charge de composer un message et de l'envoyer par une fonction php mail.

    Si l'envoi s'est fait correctement, je voudrais que l'expéditeur en soit informé par une fonction javascript contenant une alert(), lui rappelant le contenu de son envoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function afficher(s,c){
        alert('Vous venez d\'envoyer le message suivant : \n sujet : '+s+' \n texte : '+c);
    }
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(mail($to, $sujet, $corps, $entetemail)){
    echo "<script>afficher(\"".addslashes($sujet)."\",\"".addslashes($comment)."\")
    </script>" ; 
    }

    Tout va bien, tant que le textarea ne contient pas de retour chariot.
    Mais dés qu'il en contient, la transmission se faisant par php, le \n pose problème et l'alerte ne s'affiche plus.

    Est-il possible de contourner la difficulté ? Merci de m'aider.

    JD

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Bonsoir,

    Ton problème est que quand PHP génère du code JavaScript, celui-ci est inerte. Du code source. Du texte brut. Il faut d'abord qu'il passe dans les tuyaux du Net pour arriver jusqu'au navigateur/client pour être analysé et interprété par le moteur JavaScript.

    Et donc, quand ton serveur envoie un saut de ligne dans ce qui deviendra une chaîne JavaScript, il ne se doute pas que de l'autre côté du Net l'interpréteur JS ne va pas digérer la chaîne à cause du saut de ligne dedans. (Et il se mettra à raconter des trucs du genre unterminated string literal).

    Ta tentative avec les addslashes était une bonne idée, mais le problème est que les "\n" n'existent que dans le code source (PHP ou JS). Il est transformé en saut de ligne « réel » (octet 0A) quand le code source est interprété. Dans ton cas, tu dois faire l'opération inverse : transformer les sauts de ligne réels (qui proviennent du textarea) en symbole "\n" (c'est-à-dire un \ suivi d'un n, soit les octets 5C et 6E – comme tu vois ça n'a rien à voir).

    Je te propose d'utiliser une astuce basée sur la différence, propre à PHP, entre les chaînes ' (à guillemets simples) et les chaînes " (à guillemets doubles) : ces dernières sont interprétées et, en particulier, les "\n" sont transformés. Alors que les '\n' ne le sont pas.

    (J'espère que c'est assez clair parce que vu l'heure, c'est fort possible que mes capacités d'explications ne soient pas au top )

    Et comme le monde est mal foutu, il faut aussi surveiller les "\r".

    On utilise ce bon vieux str_replace :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function escapeNewLines( $s ){
        return str_replace(array("\r", "\n"), array('\r', '\n'), $s);
    }

    J'ai mis la vieille syntaxe des tableaux mais tu peux raccourcir si tu as PHP 5.4 ou supérieur.

    Donc voilà maintenant tu peux remplacer les addslashes de ton code par mes escapeNewLines

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 59
    Points : 47
    Points
    47
    Par défaut
    Super, ça marche : l'alerte affiche bien le saut de ligne.

    Mais il reste un problème : le addslashes() n'est pas compatible avec le escapeNewLines().
    Si je les mets les 2, soit rien n'est affiché, soit ce sont les \r ou \n qui s'affichent tels quels.

    Or il reste nécessaire que les apostrophes ou guillemets du texte saisi par l'utilisateur soient échappés...

    Merci pour ta contribution.

    JD

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 59
    Points : 47
    Points
    47
    Par défaut
    Ce que je viens d'écrire est inexact : le problème se pose seulement avec les guillemets.

    J'ai l'impression que le problème est résolu avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function escapeNewLines( $s ){
        $s=str_replace("\"","\\\"",$s) ;
        return str_replace(array("\r", "\n"), array('\r', '\n'), $s);
    }
    Il y a peut-être plus élégant...

    JD

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    regarde ce que donne le code source généré ...

    le problème se situe plutot coté serveur que coté js ... le traitement d'echappement devant selon moi se faire en php ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <html>
     <head>
     <?php
    $sujet=" un
    deyx
    trois";
    echo '<script type="text/javascript">
          alert("'.preg_replace('~\r\n~','\\n',$sujet).'");
    </script>'; 
     
    ?></head>
     <body></body>
    </html>

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Citation Envoyé par jd_83 Voir le message
    le addslashes() n'est pas compatible avec le escapeNewLines().
    Dans un sens en effet ça pose problème car les "\n" deviennent des "\\n", mais normalement dans l'autre sens ça marche :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    escapeNewLines(addslashes($comment))

    Or il reste nécessaire que les apostrophes ou guillemets du texte saisi par l'utilisateur soient échappés...
    Je ne crois pas. Pour être honnête, la seule utilité de addslashes selon moi était de protéger les requêtes SQL, mais maintenant qu'il y a les PDO elle ne sert carrément plus à rien.

    Citation Envoyé par jd_83 Voir le message
    Ce que je viens d'écrire est inexact : le problème se pose seulement avec les guillemets.
    Oui car ce sont les guillemets que tu utilises pour ouvrir tes chaînes JavaScript :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo "<script>afficher(\"".addslashes($sujet)."\",\"".addslashes($comment)."\")"
    //                     ^^                      ^^ ^^                        ^^
    Si tu avais déclaré les chaînes JS avec des apostrophes, tu aurais eu besoin d'échapper les apostrophes.

    Citation Envoyé par jd_83 Voir le message
    J'ai l'impression que le problème est résolu avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function escapeNewLines( $s ){
        $s=str_replace("\"","\\\"",$s) ;
        return str_replace(array("\r", "\n"), array('\r', '\n'), $s);
    }
    Il y a peut-être plus élégant...

    JD
    Plus élégant je ne sais pas. Plus court, oui si tu appliques ce que je t'ai expliqué à propos de la différence entre les guillemets doubles et simples. (Et aussi, au passage, si tu utilises la syntaxe courte des tableaux.)

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function escapeNewLines( $s ){
        $s =str_replace('"', '\"', $s) ;
        return str_replace(["\r", "\n"], ['\r', '\n'], $s);
    }

    Plus cohérent, selon moi, c'est de ne pas mettre cet échappement de guillemets dans le corps de la fonction escapeNewLines car ce besoin d'échapper les guillemets est particulier à ta chaîne JS. Si un jour tu as besoin d'utiliser une deuxième, une troisième, une n-ième chaîne JS, et que tu déclares ces chaînes avec des apostrophes, la fonction escapeNewLines te trahira car elle ne peut pas marcher avec les deux types de chaînes. C'est source d'erreurs.

    Pour faciliter la maintenance, je pense que le mieux est d'échapper le guillemet (ou l'apostrophe) au plus près de l'endroit où tu déclares la chaîne, si possible sur la même ligne :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "<script>afficher(\"".str_replace('"', '\"', escapeNewLines($sujet))."\",\"".str_replace('"', '\"', escapeNewLines($comment))."\")
    </script>";

    Et pour éviter la répétition, je pense pourquoi pas à une fonction qui ferait en même temps l'ajout des guillemets autour de la chaîne et l'échappement des guillemets dedans :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function putQuotes( $s ){
       return '"' . str_replace('"', '\"', $s) . '"';
    }
    Comme ça, plus de question à se poser : tu appelles putQuotes et c'est plié.
    En JavaScript, les guillemets simples et doubles sont exactement équivalents.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 59
    Points : 47
    Points
    47
    Par défaut
    Cette fois-ci, pour moi, tout est clair.

    Merci à tous.

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

Discussions similaires

  1. copier une chaine contenant plusieurs \0
    Par RR instinct dans le forum C
    Réponses: 11
    Dernier message: 23/11/2007, 08h46
  2. Nettoyer une chaine contenant des caractères spéciaux?
    Par adil_vpb dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 30/05/2007, 15h47
  3. [Oracle 10g] Insértion d'une chaine contenant " -- "
    Par 17mounir dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/02/2007, 15h50
  4. Réponses: 1
    Dernier message: 22/01/2007, 20h33
  5. passer d'une chaine contenant des espaces a un tableau
    Par flyfrog dans le forum Contribuez
    Réponses: 3
    Dernier message: 26/06/2006, 20h12

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