Passez une chaîne PHP à une variable JavaScript (et évitez les retours à la ligne) [dupliquer]

StackOverflow https://stackoverflow.com/questions/168214

Question

    

Cette question a déjà une réponse ici:

         

Quel est le moyen le plus simple de coder une chaîne PHP pour la sortie dans une variable JavaScript?

J'ai une chaîne PHP qui inclut des guillemets et des nouvelles lignes. J'ai besoin que le contenu de cette chaîne soit placé dans une variable JavaScript.

Normalement, je construirais simplement mon code JavaScript dans un fichier PHP, & # 224; la:

<script>
  var myvar = "<?php echo $myVarValue;?>";
</script>

Toutefois, cela ne fonctionne pas lorsque $myVarValue contient des guillemets ou des nouvelles lignes.

Était-ce utile?

La solution

Développer la réponse de quelqu'un d'autre:

<script>
  var myvar = <?php echo json_encode($myVarValue); ?>;
</script>

L'utilisation de json_encode () nécessite:

  • PHP 5.2.0 ou supérieur
  • $myVarValue codé au format UTF-8 (ou US-ASCII, bien sûr)

Etant donné qu'UTF-8 prend en charge le format Unicode complet, la conversion à la volée devrait être sûre.

Notez que, du fait que json_encode échappe des barres obliques, même une chaîne contenant </script> sera échappée en toute sécurité pour l'impression avec un bloc de script.

Autres conseils

l'encoder avec JSON

function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}

J'ai eu un problème similaire et je comprends que la solution suivante est la meilleure:

<script>
    var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>

Cependant, le lien que micahwittman a posté suggère qu'il existe des quelques différences mineures de codage. La fonction rawurlencode() de PHP est censée être conforme à la RFC 1738 , alors qu'il semble n'y en avoir pas eu effort avec Javascript decodeURIComponent().

La version paranoïaque: Échapper à chaque 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;
}

MODIFIER: Si json_encode() n'est peut-être pas approprié, vous devez parfois empêcher la génération de ", 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 je devais personnaliser n’était pas en UTF-8, je ne pouvais donc pas utiliser json; Je voterais mais mon représentant n'était pas assez élevé.

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 

Vous pouvez l'insérer dans une DIV masquée, puis affecter le innerHTML de la DIV à votre variable JavaScript. Vous n'avez pas à vous soucier d'échapper à quoi que ce soit. Assurez-vous simplement de ne pas y insérer du code HTML cassé.

Vous pouvez essayer

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>

Ne l'exécutez pas bien addslashes(); si vous êtes dans le contexte de la page HTML, l'analyseur HTML peut toujours voir la balise </script>, même au milieu de la chaîne, et supposer que c'est la fin du code 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>
  1. Don & # 8217; t. Utilisez Ajax, mettez-le dans les attributs data-* de votre code HTML, ou quelque chose de significatif. L’utilisation de scripts intégrés augmente la taille de vos pages et peut ne pas être sûr ou permettre aux utilisateurs de ruiner la mise en page , à moins que & # 8230;

  2. & # 8230; vous créez une fonction plus sûre:

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    

htmlspecialchars

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 retourne une chaîne avec certaines de ces conversions. les traductions effectuées sont les plus utiles pour la programmation Web quotidienne. Si vous souhaitez que toutes les entités de caractères HTML soient traduites, utilisez plutôt htmlentities ().

Cette fonction est utile pour empêcher que le texte fourni par l'utilisateur ne contienne du balisage HTML, comme dans un tableau d'affichage ou une application 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

Je ne suis pas sûr que ce soit une mauvaise pratique ou non, mais mon équipe et moi-même utilisons une solution mixte HTML, JS et PHP. Nous commençons avec la chaîne PHP que nous voulons extraire dans une variable JS, appelons-la:

$someString

Nous utilisons ensuite des éléments de formulaire masqués dans la page et leur valeur est définie sous la forme de la chaîne:

<form id="pagePhpVars" method="post">
<input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" />
</form>

Il suffit ensuite de définir une var JS via document.getElementById:

<script type="text/javascript" charset="UTF-8">
    var moonUnitAlpha = document.getElementById('phpString1').value;
</script>

Vous pouvez maintenant utiliser la variable JS & "; moonUnitAlpha &"; n'importe où vous voulez saisir cette valeur de chaîne PHP. Cela semble très bien fonctionner pour nous. Nous verrons si cela résiste à une utilisation intensive.

Si vous utilisez un moteur de templates pour construire votre code HTML, vous pouvez le remplir avec ce que vous voulez!

Découvrez les modèles X . C'est un bon moteur de template open source et léger.

Votre code HTML / JS ressemblerait à ceci:

<script>
    var myvar = {$MyVarValue};
</script>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top