Pasar una cadena de PHP a una variable de JavaScript (y escaping de las líneas nuevas)

¿Cuál es la forma más fácil de codificar una cadena de PHP para generar una variable de JavaScript?

Tengo una cadena de PHP que incluye comillas y nuevas líneas. Necesito que el contenido de esta cadena se ponga en una variable de JavaScript.

Normalmente, solo buildía mi JavaScript en un file PHP, à la:

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

Sin embargo, esto no funciona cuando $myVarValue contiene comillas o nuevas líneas.

Ampliando la respuesta de otra persona:

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

El uso de json_encode () requiere:

  • PHP 5.2.0 o superior
  • $myVarValue codificado como UTF-8 (o US-ASCII, por supuesto)

Dado que UTF-8 admite Unicode completo, es seguro convertirlo sobre la marcha.

Tenga en count que, debido a que json_encode escapa barras diagonales, incluso una cadena que contenga </script> se escapingá de manera segura para imprimir con un bloque de scripts.

codificarlo con JSON

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

He tenido un problema similar y entiendo que la siguiente es la mejor solución:

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

Sin embargo, el enlace que micahwittman publicó sugiere que hay algunas diferencias de encoding menores. Se supone que la function rawurlencode() PHP cumple con RFC 1738 , mientras que parece que no hubo tal esfuerzo con decodeURIComponent() Javascript.

La versión paranoica: escapando cada personaje .

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

EDITAR: La razón por la cual json_encode() puede no ser apropiado es que a veces, debe evitar que " se genere, por ej.

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

o

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

La solución de Micah a continuación me funcionó porque el sitio que tenía que personalizar no estaba en UTF-8, así que no pude usar json; Yo votaría, pero mi representante no es lo suficientemente alto.

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

htmlspecialchars

Descripción

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

Ciertos caracteres tienen un significado especial en HTML, y deberían representarse por entidades HTML si se quiere preservar sus significados. Esta function devuelve una cadena con algunas de estas conversiones realizadas; las traducciones realizadas son las más útiles para la progtwigción web diaria. Si necesita traducir todas las entidades de caracteres HTML, use htmlentities () en su lugar.

Esta function es útil para evitar que el text proporcionado por el usuario contenga marcas HTML, como en un tablero de posts o una aplicación de libro de visitas.

Las traducciones realizadas son:

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

Puede insertlo en un DIV oculto, luego asigne el innerHTML del DIV a su variable de JavaScript. No tienes que preocuparte por escaping de nada. Solo asegúrate de no poner HTML roto allí.

Tu podrías intentar

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

No lo ejecute aunque addslashes() ; si está en el context de la página HTML, el analizador HTML aún puede ver la label </script> , incluso a mitad de cadena, y suponga que es el final de 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. No lo hagas Usa Ajax, ponlo en attributes data-* en tu HTML, o algo significativo. El uso de scripts en línea hace que sus páginas sean más grandes, y puede ser inseguro o aún permitir a los usuarios arruinar el layout , a less que …

  2. … haces una function más segura:

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

No estoy seguro de si esto es una mala práctica o no, pero mi equipo y yo hemos estado usando una solución mixta html, JS y php. Comenzamos con la cadena de PHP que queremos extraer en una variable JS, vamos a llamarlo:

 $someString 

A continuación, utilizamos elementos de formulario ocultos dentro de la página y su valor se establece como la cadena:

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

Entonces es una simple cuestión de definir una var JS a través de document.getElementById:

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

Ahora puede usar la variable JS "moonUnitAlpha" en cualquier lugar que desee para get ese valor de cadena PHP. Esto parece funcionar muy bien para nosotros. Veremos si soporta el uso intensivo.

Si utiliza un motor de templates para build su HTML, ¡puede completarlo con lo que quiera!

Echa un vistazo a XTemplates . Es un buen motor de plantilla, liviano y de código abierto.

Su HTML / JS se vería así:

 <script> var myvar = {$MyVarValue}; </script>