Domanda

    

Questa domanda ha già una risposta qui:

         

Qual è il modo più semplice per codificare una stringa PHP per l'output in una variabile JavaScript?

Ho una stringa PHP che include virgolette e righe. Ho bisogno che il contenuto di questa stringa sia inserito in una variabile JavaScript.

Normalmente, vorrei solo costruire il mio JavaScript in un file PHP, & # 224; la:

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

Tuttavia, questo non funziona quando $myVarValue contiene virgolette o righe.

È stato utile?

Soluzione

Ampliamento della risposta di qualcun altro:

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

L'utilizzo di json_encode () richiede:

  • PHP 5.2.0 o versioni successive
  • $myVarValue codificato come UTF-8 (o US-ASCII, ovviamente)

Poiché UTF-8 supporta Unicode completo, dovrebbe essere sicuro convertirlo al volo.

Si noti che poiché json_encode esce dalle barre, anche una stringa che contiene </script> verrà salvata in sicurezza per la stampa con un blocco di script.

Altri suggerimenti

codificalo con JSON

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

Ho riscontrato un problema simile e capisco che la soluzione migliore è la seguente:

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

Tuttavia, il link pubblicato da micahwittman suggerisce che ci sono alcune differenze di codifica minori. Si suppone che la funzione rawurlencode() di PHP sia conforme a RFC 1738 , mentre sembra che non ci sia stato sforzo con decodeURIComponent().

di Javascript

La versione paranoica: Escaping di ogni singolo personaggio .

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;
}

MODIFICA: Il motivo per cui json_encode() potrebbe non essere appropriato è che a volte è necessario impedire che " venga generato, ad es.

<div onclick="alert(???)" />
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

o

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>

La soluzione di Micah di seguito ha funzionato per me dato che il sito che dovevo personalizzare non era in UTF-8, quindi non potevo usare json; Vorrei votare ma il mio rappresentante non è abbastanza alto.

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

È possibile inserirlo in un DIV nascosto, quindi assegnare l'HTML interno del DIV alla variabile JavaScript. Non devi preoccuparti di scappare da nulla. Assicurati solo di non inserire HTML non funzionante.

Potresti provare

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

Non eseguirlo però addslashes(); se sei nel contesto della pagina HTML, il parser HTML può ancora vedere il tag </script>, anche a metà stringa, e supporre che sia la fine del 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. Usa Ajax, inseriscilo in data-* attributi nel tuo HTML o qualcos'altro di significativo. L'uso di script inline rende le tue pagine più grandi e potrebbe essere insicuro o consentire agli utenti di rovinare il layout , a meno che & # 8230;

  2. &
  3. # 8230; rendi una funzione più sicura:

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

htmlspecialchars

Descrizione

string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )

Alcuni caratteri hanno un significato speciale in HTML e dovrebbero essere rappresentati da entità HTML se vogliono preservare i loro significati. Questa funzione restituisce una stringa con alcune di queste conversioni effettuate; le traduzioni fatte sono quelle più utili per la programmazione web quotidiana. Se hai bisogno di tradurre tutte le entità di caratteri HTML, usa invece htmlentities ().

Questa funzione è utile per impedire che il testo fornito dall'utente contenga markup HTML, ad esempio in una bacheca di messaggi o in un'applicazione del libro degli ospiti.

Le traduzioni eseguite sono:

* '&' (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

Non sono sicuro che si tratti di una cattiva pratica o no, ma il mio team e io abbiamo usato una soluzione mista html, JS e php. Iniziamo con la stringa PHP che vogliamo inserire in una variabile JS, chiamiamola:

$someString

Successivamente utilizziamo elementi di modulo nascosti in-page e il loro valore è impostato come stringa:

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

Quindi si tratta semplicemente di definire una var JS tramite document.getElementById:

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

Ora puoi usare la variabile JS " moonUnitAlpha " ovunque tu voglia prendere quel valore di stringa PHP. Questo sembra funzionare davvero bene per noi. Vedremo se regge a un uso intenso.

Se usi un motore di template per costruire il tuo HTML, puoi riempirlo con quello che vuoi!

Guarda XTemplates . È un motore di template piacevole, open source, leggero.

Il tuo HTML / JS sarebbe simile a questo:

<script>
    var myvar = {$MyVarValue};
</script>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top