Pase una cadena PHP a una variable JavaScript (y escape de nuevas líneas) [duplicar]


Esta pregunta ya tiene una respuesta aquí:

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

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

Normalmente, simplemente construiría mi JavaScript en un archivo PHP, à la:

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

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

Author: Ry-, 2008-10-03

14 answers

Ampliando la respuesta de otra persona:

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

Usando 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, debería ser seguro convertir sobre la marcha.

Tenga en cuenta que debido a que json_encode escapa de las barras inclinadas, incluso una cadena que contenga </script> se escapará de forma segura para imprimir con un bloque de script.

 473
Author: bobwienholt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-13 14:53:30

Codifícalo con JSON

 25
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-03 18:33:50
function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
 19
Author: micahwittman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-03 18:38:29

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 codificación menores. La función rawurlencode() de PHP se supone que cumple con RFC 1738, mientras que parece que no ha habido tal esfuerzo con decodeURIComponent() de Javascript.

 17
Author: pr1001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-14 13:33:39

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 que json_encode() puede no ser apropiado es que a veces, necesita evitar que " se genere, por ejemplo,

<div onclick="alert(???)" />
 9
Author: giraff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-08 12:45:29
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

O

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
 5
Author: Kld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-25 14:46:47

La solución de Micah a continuación funcionó para mí, ya que el sitio que tuve que personalizar no estaba en UTF-8, por lo que no pude usar json; lo votaría, pero mi reputación no es lo suficientemente alta.

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 
 3
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-18 21:25:34

Htmlspecialchars

Descripción

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

Ciertos caracteres tienen un significado especial en HTML, y deben ser representados por entidades HTML si quieren preservar sus significados. Esta función devuelve una cadena con algunas de estas conversiones realizadas; las traducciones realizadas son las más útiles para la programación web diaria. Si necesita que se traduzcan todas las entidades de caracteres HTML, utilice htmlentities () en su lugar.

Esta función es útil para evitar que el usuario texto que contiene marcado HTML, como en un tablero de mensajes 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

 2
Author: Chris MacDonald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-03 18:37:46

Puede insertarlo en un DIV oculto, luego asignar el innerHTML del DIV a su variable JavaScript. No tienes que preocuparte por escapar de nada. Solo asegúrese de no poner HTML roto allí.

 2
Author: Diodeus - James MacFarlane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-03 18:39:14

Usted podría intentar

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
 2
Author: Jacob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-03 18:50:19

No lo ejecute addslashes(); si está en el contexto de la página HTML, el analizador HTML todavía puede ver la etiqueta </script>, incluso la cadena intermedia, y asumir que es el final 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>
 2
Author: Craig Francis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-08 18:06:17
  1. No lo haga. Use Ajax, póngalo en los atributos data-* en su HTML, o algo más significativo. El uso de scripts en línea hace que sus páginas sean más grandes, y podría ser inseguro o aún permitir que los usuarios arruinen el diseño , a menos que {

  2. Make haces una función más segura:

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    
 2
Author: Ry-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-08 18:19:06

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 de html, JS y php. Comenzamos con la cadena PHP que queremos extraer en una variable JS, llamémosla:

$someString

Luego usamos elementos de formulario ocultos en 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 un JS var a través de documento.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 tomar ese PHP valor de cadena. Esto parece funcionar muy bien para nosotros. Veremos si aguanta el uso pesado.

 -2
Author: ioTus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-27 00:28:00

Si usas un motor de plantillas para construir tu HTML, entonces puedes llenarlo con lo que quieras.

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

Su HTML / JS se vería así:

<script>
    var myvar = {$MyVarValue};
</script>
 -2
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-20 09:34:54