Passer une chaîne PHP à une variable JavaScript (et échapper aux nouvelles lignes) [dupliquer]
cette question a déjà une réponse ici:
- Comment passer des variables et des données de PHP à JavaScript? 18 réponses
Quelle est la meilleure façon d'encoder une chaîne PHP pour la sortie vers une variable JavaScript?
j'ai une chaîne de caractères PHP qui inclut des guillemets et les retours à la ligne. J'ai besoin que le contenu de cette chaîne soit mis dans une variable JavaScript.
normalement, je construirais Mon JavaScript dans un fichier PHP, à la:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
cependant, cela ne fonctionne pas lorsque $myVarValue
contient des guillemets ou des nouvelles.
14 réponses
élargir la réponse de quelqu'un d'autre:
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
utilisant json_encode () nécessite:
- PHP 5.2.0 ou plus
-
$myVarValue
codé en UTF-8 (ou US-ASCII, bien sûr)
depuis UTF-8 supporte Unicode complet, il devrait être sûr de convertir à la volée.
noter que parce que json_encode
échappe slashes avant, même une chaîne qui contient </script>
sera échappée en toute sécurité pour l'impression avec un bloc de script.
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), ""151900920"..'\")));
}
j'ai eu un problème similaire et comprendre que la meilleure solution est la suivante:
<script>
var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>
cependant, le lien que micahwittman a posté suggère qu'il y a quelques différences mineures d'encodage. La fonction rawurlencode()
de PHP est censée être conforme à la RFC 1738 , alors qu'il semble qu'il n'y ait pas eu un tel effort avec decodeURIComponent()
de Javascript .
Les paranoïaques version: Échappant à toute seul caractère .
function javascript_escape($str) {
$new_str = '';
$str_len = strlen($str);
for($i = 0; $i < $str_len; $i++) {
$new_str .= '\x' . sprintf('%02x', ord(substr($str, $i, 1)));
}
return $new_str;
}
EDIT: La raison json_encode()
peut ne pas être appropriée est que, parfois, vous avez besoin pour prévenir "
pour être produites, par exemple,
<div onclick="alert(???)" />
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>
ou
<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
la solution de Micah ci-dessous a fonctionné pour moi car le site que j'ai dû personnaliser n'était pas en UTF-8, donc je ne pouvais pas utiliser json; je l'aurais voté mais mon rep n'est pas assez élevé.
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), ""151900920"..'\")));
}
htmlschars Spéciaux
Description
string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )
certains caractères ont une signification particulière en HTML et doivent être représentés par des entités HTML pour préserver leur signification. Cette fonction renvoie une chaîne avec certaines de ces conversions faites; les traductions faites sont celles qui sont les plus utiles pour la programmation web quotidienne. Si vous avez besoin que toutes les entités de caractères HTML soient traduites, utilisez htmlentities() à la place.
cette fonction est utile pour empêcher le texte fourni par l'utilisateur de contenir un balisage HTML, comme dans une application de forum de discussion ou de livre d'or.
les traductions effectuées sont:
* '&' (ampersand) becomes '&'
* '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes ''' only when ENT_QUOTES is set.
* '<' (less than) becomes '<'
* '>' (greater than) becomes '>'
vous pouvez l'insérer dans un DIV caché, puis assigner l'innerHTML du DIV à votre variable JavaScript. Vous n'avez pas à vous soucier d'échapper à quoi que ce soit. Assurez-vous juste de ne pas mettre de HTML cassé là-dedans.
Vous pouvez essayer de
<script type="text/javascript">
myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
ne l'exécutez pas bien que addslashes()
; si vous êtes dans le contexte de la page HTML, L'analyseur HTML peut toujours voir la balise </script>
, même mid-string, et supposer que c'est la fin du JavaScript:
<?php
$value = 'XXX</script><script>alert(document.cookie);</script>';
?>
<script type="text/javascript">
var foo = <?= json_encode($value) ?>; // Use this
var foo = '<?= addslashes($value) ?>'; // Avoid, allows XSS!
</script>
-
Don'T. Utilisez Ajax, mettez - le dans
data-*
attributs dans votre HTML, ou quelque chose d'autre significatif. L'utilisation de scripts en ligne rend vos pages plus grandes, et pourrait être peu sûr ou encore permettre aux utilisateurs de ruiner la mise en page , à moins que... -
... vous rendez la fonction plus sûre:
function inline_json_encode($obj) { return str_replace('<!--', '<\!--', json_encode($obj)); }
Je ne suis pas sûr que ce soit une mauvaise pratique ou non, mais mon équipe et moi avons utilisé une solution mixte html, JS, et php. Nous commençons avec la chaîne PHP que nous voulons tirer dans une variable JS, appelons-la:
$someString
ensuite, nous utilisons des éléments de forme cachés dans la page, et avons leur valeur définie comme la chaîne de caractères:
<form id="pagePhpVars" method="post">
<input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" />
</form>
alors il s'agit simplement de définir un js var à travers un document.getElementById:
<script type="text/javascript" charset="UTF-8">
var moonUnitAlpha = document.getElementById('phpString1').value;
</script>
maintenant vous pouvez utiliser la variable JS "moonUnitAlpha" partout où vous voulez saisir cette valeur de chaîne de caractères PHP. Cela semble vraiment bien fonctionner pour nous. On verra si ça résiste à l'usage intensif.
si vous utilisez un moteur de templage pour construire votre HTML, alors vous pouvez le remplir avec tout ce que vous voulez!
Check out XTemplates . C'est un beau moteur open source, léger et modèle.
votre HTML / JS là ressemblerait à ceci:
<script>
var myvar = {$MyVarValue};
</script>