Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Passer une valeur quelconque de PHP a JavaScript

37 réponses
Avatar
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 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.

10 réponses

1 2 3 4
Avatar
Olivier Miakinen
Bonjour,

je me réponds, mais j'aimerais bien avoir l'avis d'autres
PhpJavaScripteurs...

Le 07/12/2008 23:41, Olivier Miakinen a écrit :

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; ?>';

[...]

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", "xE2x80xA8", "xE2x80xA9");
$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&gt;
Avatar
Mickael Wolff
Olivier Miakinen a écrit :

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&gt;

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Cenekemoi
Bonjour à Olivier Miakinen <om+ qui nous a écrit :
[ 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&gt;).


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,



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 ;-)
Avatar
SAM
Le 12/7/08 11:41 PM, Olivier Miakinen a écrit :
[ diapublication entre fcl.php et fcl.javascript, suivi sur fcl.php(¹) ]



et pourquoi ?

Alors que la réponse est XRH ... !

--
sm
Avatar
Olivier Miakinen
Le 08/12/2008 10:14, Mickael Wolff a écrit :

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&gt;



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
Avatar
Olivier Miakinen
Le 08/12/2008 10:14, Cenekemoi a écrit :

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).

Si cela peut aider...



Merci de ton aide en tout cas.

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Bonjour,

Le 08/12/2008 11:30, SAM me répondait :

[ diapublication entre fcl.php et fcl.javascript, suivi sur fcl.php(¹) ]



et pourquoi ?

Alors que la réponse est XRH ... !



Même en supposant que tu voulais dire « XHR » au lieu de « XRH », je
ne comprends pas ta réponse, et je soupçonne qu'en fait c'est toi qui
n'avais pas compris ma question... Je la reformule donc.

Je génère sur le serveur une page HTML incluant du code JavaScript.
Dans ce code, il y a des initialisations de variables du style
« var truc = 3; » ou « var machin = 'chaîne'; », et je voudrais
m'assurer que ce que je mets à la place de « chaîne » sera toujours
correct, même si au départ c'est dans une variable PHP et que cette
variable peut contenir n'importe quels caractères unicode valides.

Il n'y a évidemment pas besoin d'aller chercher l'artillerie lourde de
XMLHttpRequest -- et en outre ça ne fait que déporter le problème sans
le résoudre.
Avatar
SAM
Le 12/8/08 12:50 PM, Olivier Miakinen a écrit :
Bonjour,

Le 08/12/2008 11:30, SAM me répondait :
[ diapublication entre fcl.php et fcl.javascript, suivi sur fcl.php(¹) ]


et pourquoi ?

Alors que la réponse est XRH ... !



Même en supposant que tu voulais dire « XHR » au lieu de « XRH »,



oui.
Ha! ce clavier dyslexique !

Il n'y a évidemment pas besoin d'aller chercher l'artillerie lourde de
XMLHttpRequest -- et en outre ça ne fait que déporter le problème sans
le résoudre.



Dans la mesure où le lien donné proposait ça dans un sens, dans l'autre
ce devrait être pareil.

sinon si le php se débrouille avec son $str
pourquoi le JS ne pourrait-il pas en faire autant ?
¡¿ Me no lo comprendo ?!

voir réponse de l'autre côté.
(où je vois que vous causez sans moi, scrmbmlbl!).

Pour Json en JS :
<http://www.json.org/js.html&gt;
et en PHP je suppose qu'on doit pouvoir faire sa propre moulinette?
(on doit pouvoir faire "à la Json" seulement ? s'inspirer du truc?)

--
sm
Avatar
Alex Marandon
Olivier Miakinen wrote:
Je génère sur le serveur une page HTML incluant du code JavaScript.
Dans ce code, il y a des initialisations de variables du style
« var truc = 3; » ou « var machin = 'chaîne'; », et je voudrais
m'assurer que ce que je mets à la place de « chaîne » sera toujours
correct, même si au départ c'est dans une variable PHP et que cette
variable peut contenir n'importe quels caractères unicode valides.



À mon avis utiliser PHP pour générer des chaines litéralles JavaScript
n'est pas une bonne idée, justement à cause du problème que tu évoques.


Il n'y a évidemment pas besoin d'aller chercher l'artillerie lourde de
XMLHttpRequest -- et en outre ça ne fait que déporter le problème sans
le résoudre.



Si ça le resoud puisque tu n'a plus le problème de créer des chaines
litéralles valides en JavaScript. Pour ne pas faire de requêtes HTTP
supplémentaires, tu peux inclure tes données dans le DOM:
<div id="data" style="display:none"><?php echo $str; ?></div>
Tu n'as plus alors qu'à gérer les problèmes d'échapement habituels liés
à HTML.
Avatar
Pierre Goiffon
Olivier Miakinen wrote:
Je génère sur le serveur une page HTML incluant du code JavaScript.
Dans ce code, il y a des initialisations de variables du style
« var truc = 3; » ou « var machin = 'chaîne'; », et je voudrais
m'assurer que ce que je mets à la place de « chaîne » sera toujours
correct, même si au départ c'est dans une variable PHP et que cette
variable peut contenir n'importe quels caractères unicode valides.



Que signifie "toujours correct" ?
A première vue du moment que la chaine ne contient pas de ' et vu ce qui
a été dis (page en UTF-8 et tous les caractères sont corrects) alors
qu'est-ce qui ne pourrait pas aller ?
1 2 3 4