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 confirm�
    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
    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 confirm�
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    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
    La FAQ JavaScript � Les cours JavaScript
    Touche F12 = la console → l�outil indispensable pour d�velopper en JavaScript !

  3. #3
    Membre confirm�
    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
    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 confirm�
    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
    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 659
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    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 659
    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>
    Ma page Developpez - Mon Blog Developpez
    Pr�sident du CCMPTP (Comit� Contre le Mot "Probl�me" dans les Titres de Posts)
    Deux r�gles du succ�s: 1) Ne communiquez jamais � quelqu'un tout votre savoir...
    Votre post est r�solu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de D�veloppez !

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

    Informations professionnelles :
    Activit� : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    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.
    La FAQ JavaScript � Les cours JavaScript
    Touche F12 = la console → l�outil indispensable pour d�velopper en JavaScript !

  7. #7
    Membre confirm�
    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
    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