Discussion:
Passer une valeur quelconque de PHP a JavaScript
(trop ancien pour répondre)
Olivier Miakinen
2008-12-07 22:41:10 UTC
Permalink
[ diapublication entre fcl.php et fcl.javascript, suivi sur fcl.php(¹) ]

Bonjour,

La question que je me pose, je suis étonné de ne pas l'avoir encore vue
passer. Je n'ai rien trouvé non plus dans la FAQ, même si j'ai trouvé
la question inverse (avec une réponse lapidaire assez logique :
<http://faqfclphp.free.fr/#rub2.8>).


Je voudrais transmettre le contenu d'une variable de type chaîne de
caractères de PHP à JavaScript. À priori, rien de plus simple :
var str = '<?php echo $str; ?>';

Mais le problème, c'est que la chaîne en PHP $str peut contenir à peu
près n'importe quoi, par exemple des caractères chinois ou japonais,
mais aussi des apostrophes simples (') ou doubles ("), des sauts de
ligne, des barres obliques dans un sens et dans l'autre (/ et \) et
ainsi de suite.

Je précise que le codage de $str est de l'UTF-8, et celui du fichier
HTML aussi. Il ne peut pas y avoir de caractère invalide (genre une
valeur CP1252 entre 128 et 159 transformée en UTF-8 comme si c'était
du Latin-1) mais à peu près tout point de code valide entre U+0001 et
U+FFFF est susceptible de s'y retrouver.

Comment puis-je faire pour assurer que ça marche dans tous les cas ?

Cordialement,
--
Olivier Miakinen

(¹) Si votre réponse utilise plus de JavaScript que de PHP, n'hésitez
pas à changer de groupe pour la suite de la discussion.
Olivier Miakinen
2008-12-08 00:29:40 UTC
Permalink
Bonjour,

je me réponds, mais j'aimerais bien avoir l'avis d'autres
PhpJavaScripteurs...
Post by Olivier Miakinen
Je voudrais transmettre le contenu d'une variable de type chaîne de
var str = '<?php echo $str; ?>';
[...]
Comment puis-je faire pour assurer que ça marche dans tous les cas ?
Finalement, après avoir consulté surtout la doc de référence de
JavaScript (¹), il apparaît que les seuls caractères que l'on doit
absolument échapper dans une chaîne sont :
- le caractère \
- le caractère ' (pour les chaînes entre '')
- le caractère " (pour les chaînes entre "")
- les quatre « LineTerminator » qui sont Line Feed (\n, U+000A),
Carriage Return (\r, U+000D), Line separator (U+2028) et Paragraph
separator (U+2029).

Du coup, le code suivant fait ce que je veux :

<?php
function php2js($str)
{
$from =
array("\\", "'", '"', "\r", "\n", "\xE2\x80\xA8", "\xE2\x80\xA9");
$to =
array('\\\\', '\\\'', '\"', '\r', '\n', '\u2028', '\u2029');
return str_replace($from, $to, $str);
}
?>

...

var str = '<?php echo php2js($str) ?>';

ou

var str = "<?php echo php2js($str) ?>";
--
Olivier Miakinen

(¹)<http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf>
Cenekemoi
2008-12-08 15:31:33 UTC
Permalink
Post by Olivier Miakinen
(...)
- les quatre « LineTerminator » qui sont Line Feed (\n, U+000A),
Carriage Return (\r, U+000D), Line separator (U+2028) et Paragraph
separator (U+2029).
<?php
function php2js($str)
{
$from =
array("\\", "'", '"', "\r", "\n", "\xE2\x80\xA8", "\xE2\x80\xA9");
$to =
array('\\\\', '\\\'', '\"', '\r', '\n', '\u2028', '\u2029');
return str_replace($from, $to, $str);
}
Désolé, mais je connais mal PHP (je suis plutôt Java), mais je comprend
mal ce que va donner les changement de "\r" et "\n" en '\r' et '\n'.
Peux-tu m'éclairer, STP ?
--
Cordialement, Thierry ;-)
Olivier Miakinen
2008-12-08 16:06:07 UTC
Permalink
Post by Cenekemoi
Post by Olivier Miakinen
<?php
function php2js($str)
{
$from =
array("\\", "'", '"', "\r", "\n", "\xE2\x80\xA8", "\xE2\x80\xA9");
$to =
array('\\\\', '\\\'', '\"', '\r', '\n', '\u2028', '\u2029');
return str_replace($from, $to, $str);
}
Désolé, mais je connais mal PHP (je suis plutôt Java), mais je comprend
mal ce que va donner les changement de "\r" et "\n" en '\r' et '\n'.
Peux-tu m'éclairer, STP ?
Oui, bien sûr. "\n" représente l'unique caractère dont le code ASCII ou
Unicode est 10, tandis que '\n' est une chaîne de deux caractères, de
codes respectifs 92 (\) et 110 (n). Pour info, '\n' signifie la même
chose que "\\n". Idem avec "\r" (code 13) et '\r' (égal à "\\r").

Cordialement,
--
Olivier Miakinen
Cenekemoi
2008-12-08 16:48:28 UTC
Permalink
Post by Olivier Miakinen
(...)
Pour info, '\n' signifie la
même chose que "\\n". Idem avec "\r" (code 13) et '\r' (égal à "\\r").
Ok, compris ! Merci pour l'explication...

...et c'est vrai que dans nos applications Java, nous n'avons pas a
priori de CRLF dans les données avec lesquelles nous travaillons.

Mais je vais quand même vérifier tout cela et peut-être blinder la bête
!...
--
Cordialement, Thierry ;-)
mpg
2008-12-09 00:39:24 UTC
Permalink
Post by Olivier Miakinen
Post by Cenekemoi
Post by Olivier Miakinen
$from =
array("\\", "'", '"', "\r", "\n", "\xE2\x80\xA8", "\xE2\x80\xA9");
$to =
array('\\\\', '\\\'', '\"', '\r', '\n', '\u2028', '\u2029');
return str_replace($from, $to, $str);
Désolé, mais je connais mal PHP (je suis plutôt Java), mais je comprend
mal ce que va donner les changement de "\r" et "\n" en '\r' et '\n'.
Peux-tu m'éclairer, STP ?
Oui, bien sûr. "\n" représente l'unique caractère dont le code ASCII ou
Unicode est 10, tandis que '\n' est une chaîne de deux caractères, de
codes respectifs 92 (\) et 110 (n). Pour info, '\n' signifie la même
chose que "\\n". Idem avec "\r" (code 13) et '\r' (égal à "\\r").
Si je peux me permettre, niveau lisibilité du code, je préfère vachement
voir remplacer "\r" par "\\r" que "\r" par '\r'. Enfin, les goûts et les
couleurs...

Manuel.
Cenekemoi
2008-12-09 11:31:17 UTC
Permalink
Post by mpg
Si je peux me permettre, niveau lisibilité du code, je préfère
vachement voir remplacer "\r" par "\\r" que "\r" par '\r'. Enfin, les
goûts et les couleurs...
Manuel.
+1
--
Cordialement, Thierry ;-)
Olivier Miakinen
2008-12-09 12:00:10 UTC
Permalink
Post by mpg
Si je peux me permettre, niveau lisibilité du code, je préfère
vachement voir remplacer "\r" par "\\r" que "\r" par '\r'.
Pas moi. Moins il y a de \ à compter et plus je trouve le résultat
lisible ; d'ailleurs c'est aussi pour ça que je corrige toujours les
« echo "<a href=\"$href\">"; » en « echo "<a href='$href'>"; ».

Évidemment, cela oblige à avoir en tête les différentes syntaxes
d'écriture des chaînes, ce qui se complique encore quand on doit
le faire pour PHP, JavaScript, C, shell, et d'autres langages aux
syntaxes incompatibles les unes avec les autres.

Au passage Cenekemoi, et quoi que ce soit hors sujet ici, cela fait
longtemps que je n'ai pas fait de Java et je ne comprends pas pourquoi
tu mets tant de \ dans :
str = str.replaceAll("\"", "\\\\\""); (" -> \\" et pas \" ?)
str = str.replaceAll("'", "\\\\'"); (' -> \\' et pas \' ?)
Post by mpg
Enfin, les goûts et les couleurs...
Manuel.
+1
+1 aussi, sauf que je ne m'appelle pas Manuel.

Mickael Wolff
2008-12-08 09:14:47 UTC
Permalink
Post by Olivier Miakinen
Comment puis-je faire pour assurer que ça marche dans tous les cas ?
À mon avis, le module JSON devrait assurer une bonne protection des
données PHP utilisées dans du javascript. À vérifier
<http://fr.php.net/json>
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Olivier Miakinen
2008-12-08 11:19:55 UTC
Permalink
Post by Mickael Wolff
Post by Olivier Miakinen
Comment puis-je faire pour assurer que ça marche dans tous les cas ?
À mon avis, le module JSON devrait assurer une bonne protection des
données PHP utilisées dans du javascript. À vérifier
<http://fr.php.net/json>
Merci, je ne connaissais pas ce module. Je ne peux malheureusement pas
le tester car il n'est pas installé chez mon hébergeur, pourtant en
5.2.5, mais si j'en crois le code source que j'ai trouvé ici ça devrait
fonctionner :

http://www.opensource.apple.com/darwinsource/Current/apache_mod_php-44.1/php/ext/json/json.c
http://tinyurl.com/6gqawt

Les inconvénients que j'y vois, outre que le module doit être installé,
c'est que c'est un peu lourd pour une simple chaîne, et qu'en outre il
transforme *tout* caractère non ASCII en une séquence de 6 caractères
\uXXXX. Et bien sûr il faudra faire le json_decode dans la partie
JavaScript.

Mais c'est intéressant à connaître pour des structures de données
complexes (des tableaux de tableaux par exemple). Encore merci !

Cordialement,
--
Olivier Miakinen
Mickael Wolff
2008-12-08 21:34:12 UTC
Permalink
Post by Olivier Miakinen
Et bien sûr il faudra faire le json_decode dans la partie
JavaScript.
C'est un eval de la chaîne qu'il faut faire en fait.
Post by Olivier Miakinen
Mais c'est intéressant à connaître pour des structures de données
complexes (des tableaux de tableaux par exemple). Encore merci !
JSON a le vent en poupe pour shunter XML dans les cas où il est
certain que la cible est un navigateur Web comprenant ecmascript.

var datas = eval(xhr.responseText) ;
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Cenekemoi
2008-12-08 09:14:47 UTC
Permalink
Post by Olivier Miakinen
[ diapublication entre fcl.php et fcl.javascript, suivi sur
fcl.php(¹) ]
Bonjour,
La question que je me pose, je suis étonné de ne pas l'avoir encore
vue passer. Je n'ai rien trouvé non plus dans la FAQ, même si j'ai
<http://faqfclphp.free.fr/#rub2.8>).
Je voudrais transmettre le contenu d'une variable de type chaîne de
var str = '<?php echo $str; ?>';
Mais le problème, c'est que la chaîne en PHP $str peut contenir à peu
près n'importe quoi, par exemple des caractères chinois ou japonais,
mais aussi des apostrophes simples (') ou doubles ("), des sauts de
ligne, des barres obliques dans un sens et dans l'autre (/ et \) et
ainsi de suite.
Je précise que le codage de $str est de l'UTF-8, et celui du fichier
HTML aussi. Il ne peut pas y avoir de caractère invalide (genre une
valeur CP1252 entre 128 et 159 transformée en UTF-8 comme si c'était
du Latin-1) mais à peu près tout point de code valide entre U+0001 et
U+FFFF est susceptible de s'y retrouver.
Comment puis-je faire pour assurer que ça marche dans tous les cas ?
Cordialement,
Dans nos applications (qui fonctionnent en UTF-8), il nous suffit de
changer en premier le "\" en "\\" et *ensuite* l'apostrophe "'" en "\'".

Je ne travaille pas en PHP mais en Java. Voila ce que ça donne dans le
code (noter les "\" en nombre) :

str = str.replaceAll("\"", "\\\\\"");
str = str.replaceAll("'", "\\\\'");

Si cela peut aider...
--
Cordialement, Thierry ;-)
Olivier Miakinen
2008-12-08 11:19:55 UTC
Permalink
Post by Cenekemoi
Dans nos applications (qui fonctionnent en UTF-8), il nous suffit de
changer en premier le "\" en "\\" et *ensuite* l'apostrophe "'" en "\'".
Malheureusement ça ne suffit pas. Je suis d'accord qu'il n'est pas
nécessaire de gérer les guillemets doubles si toutes tes chaînes sont
affectées entre guillemets simples, mais on ne peut pas faire l'impasse
sur les sauts de ligne car le code suivant provoque une erreur de
syntaxe et l'arrêt de l'interpréteur :

var str = 'Avec un
saut de ligne';

J'ai vérifié que c'était bien la même chose avec les deux séparateurs
LS (U+2028) et PS (U+2029).
Post by Cenekemoi
Si cela peut aider...
Merci de ton aide en tout cas.

Cordialement,
--
Olivier Miakinen
Continuer la lecture sur narkive:
Loading...