Passe uma string PHP para uma variável JavaScript (e escapar novas linhas) [duplicado]
-
03-07-2019 - |
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.
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>
-
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 ... -
... 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 '&'
* '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes ''' only when ENT_QUOTES is set.
* '<' (less than) becomes '<'
* '>' (greater than) becomes '>'
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>