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.

342
demandé sur Ry- 2008-10-03 22:27:03

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.

473
répondu bobwienholt 2015-11-13 14:53:30

l'encoder avec JSON

25
répondu Javier 2008-10-03 18:33:50
function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), ""151900920"..'\")));
}
19
répondu micahwittman 2008-10-03 18:38:29

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 .

17
répondu pr1001 2009-01-14 13:33:39

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(???)" />
9
répondu giraff 2015-11-08 12:45:29
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

ou

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
5
répondu Kld 2013-01-25 14:46:47

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"..'\"))); 
} 
3
répondu SLaks 2011-05-18 21:25:34

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 '&amp;'
* '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.
* '<' (less than) becomes '&lt;'
* '>' (greater than) becomes '&gt;'

http://ca.php.net/htmlspecialchars

2
répondu Chris MacDonald 2008-10-03 18:37:46

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.

2
répondu Diodeus - James MacFarlane 2008-10-03 18:39:14

Vous pouvez essayer de

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
2
répondu Jacob 2008-10-03 18:50:19

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>
2
répondu Craig Francis 2014-01-08 18:06:17
  1. 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...

  2. ... vous rendez la fonction plus sûre:

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    
2
répondu Ry- 2014-01-08 18:19:06

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.

-2
répondu ioTus 2010-08-27 00:28:00

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>
-2
répondu Adam 2014-08-20 09:34:54