Pergunta

Esta questão já tem uma resposta aqui:

O que é a maneira mais fácil de codificar uma seqüência de PHP para saída para uma variável JavaScript?

Eu tenho uma string PHP que inclui citações e novas linhas. Eu preciso o conteúdo desta string para ser colocado em uma variável JavaScript.

Normalmente, eu seria apenas construir meu JavaScript em um arquivo PHP, à la:

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

No entanto, isso não funciona quando $myVarValue contém citações ou novas linhas.

Foi útil?

Solução

Expandindo resposta de outra pessoa:

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

Usando json_encode () requer:

  • PHP 5.2.0 ou superior
  • $myVarValue codificado como UTF-8 (ou US-ASCII, é claro)

Desde UTF-8 suportes completo Unicode, ele deve ser seguro para converter na mosca.

Note que, porque json_encode escapa barras, até mesmo uma cadeia que contém </script> será escaparam com segurança para impressão com um bloco de script.

Outras dicas

codificá-lo com JSON

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

Eu tive um problema semelhante e entender que o seguinte é a melhor solução:

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

No entanto, o link que micahwittman postou sugere que existem algumas pequenas diferenças de codificação. função rawurlencode() do PHP é suposto cumprir RFC 1738 , enquanto não parece ter havido tal esforço com decodeURIComponent() do Javascript.

A versão paranóica:. Escapando cada personagem

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: A razão pela qual json_encode() pode não ser apropriado é que às vezes, você precisa para evitar " a ser gerado, por exemplo,

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

ou

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

solução de Miquéias abaixo funcionou para mim como o local que eu tinha que personalizam não estava em UTF-8, então eu não poderia usar json; Eu votaria-lo, mas meu representante não é alta o suficiente.

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

Você pode inseri-lo em um DIV oculto, em seguida, atribuir o innerHTML do DIV a sua variável de JavaScript. Você não precisa se preocupar em escapar nada. Apenas não se esqueça de colocar HTML quebrado lá dentro.

Você poderia tentar

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

não executá-lo embora addslashes(); se você estiver no contexto da página HTML, o analisador HTML ainda pode ver a tag </script>, mesmo no meio da corda, e assumir que é o fim do 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. Do not. Use Ajax, colocá-lo em atributos data-* em seu HTML, ou algo mais significativo. Usando scripts em linha faz suas páginas maiores, e poderia ser inseguro ou ainda permitir que os usuários disposição ruína, a menos que ...

  2. ... você fazer uma função mais seguro:

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

htmlspecialchars

Descrição

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

Certos caracteres tem significado especial em HTML, e deve ser representado por entidades HTML se quiserem preservar seus significados. Esta função retorna uma string com algumas destas conversões feitas; as traduções feitas são aquelas mais útil para a programação diária web. Se você precisar de todas as entidades de caracteres HTML a ser traduzido, use htmlentities () em vez.

Esta função é útil na prevenção de texto fornecido pelo usuário que contém HTML marcação, como em uma aplicação de livro de quadro de mensagens ou convidado.

As traduções executadas são:

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

Eu não tenho certeza se isso é uma prática ruim ou não, mas minha equipe e eu tenho usado um html mista, JS, e solução de php. Começamos com a string PHP queremos puxar para uma variável JS, vamos chamá-lo:

$someString

Em seguida, usamos em páginas oculta elementos de formulário, e têm o seu valor definido como a string:

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

Então é uma questão simples de definir uma var JS através document.getElementById:

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

Agora você pode usar a variável JS "moonUnitAlpha" em qualquer lugar que você quer agarrar esse valor seqüência de PHP. Isso parece funcionar muito bem para nós. Vamos ver se ele mantém-se ao uso pesado.

Se você usar um motor de templates para construir o seu HTML, então você pode preenchê-lo com o que você quiser!

Confira XTemplates . É uma boa, de código aberto, leve, modelo de motor.

O seu HTML / JS não ficaria assim:

<script>
    var myvar = {$MyVarValue};
</script>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top