JavaScript gerado por PHP e aspas
-
21-09-2019 - |
Pergunta
Estou gerando algum javascript no meu código PHP e preciso atribuir algumas variáveis php a variáveis javascript.Infelizmente, às vezes minhas variáveis PHP contêm aspas.por exemplo:
$foo = "'Dis here be a \"string\"";
print "<script type='text/javascript'>var foo = '{$foo}';</script>";
irá gerar um erro de javascript porque o javascript resultante ficará assim:
<script type='text/javascript'>var foo = '"'Dis here be a \"string\"';
Eu sei que posso usar regexp em $foo para substituir todos '
marcas com \'
mas isso é difícil por vários motivos.Há algo que eu possa fazer além disso?Algo semelhante ao perl q()
função...
Solução
Tentei fazer isso?
$foo = "'Dis here be a \"string\"";
echo '<script type="text/javascript">var foo = "'.addslashes($foo).'";</script>';
Outras dicas
Eu uso json_encode().
Este deve ser um passo na direção certa:
addcslashes($str, "\"\r\n\\\t/\0..\37");
Tem certeza?Não é:
var foo = ''Dis here be a "string"'
Para evitar o duplo 'tente:
$foo = "\'Dis here be a \"string\"";
ou
$foo = '\\\'Dis here be a "string"';
Também é importante notar que você pode usar um arquivo PHP como um arquivo JavaScript
<script type="text/javascript" src="js/main.php"></script>
E você é capaz de executar código PHP nesse arquivo, bem como gerar código JavaScript ecoando do PHP.
Como você está usando o valor final em JavaScript, eu usaria json_encode
:
$foo = "'Dis here be a \"string\"";
print "<script type='text/javascript'>var foo = " . json_encode($foo) . ";</script>";
E a saída será correta:
<script type='text/javascript'>var foo = "'Dis here be a \"string\"";</script>
Observe que não coloquei um conjunto extra de aspas ao redor do json_encode
função.Ele adicionará as aspas necessárias para torná-la uma string JavaScript válida automaticamente.
A resposta de Frank Farmer é interessante, mas está escapando de algumas coisas que não precisam ser escapadas, como guias.
Experimente este trecho, funciona perfeitamente:
<script type="text/javascript">
alert("Hi!\n\tHi!\n<?php echo '\tHI!',"\\n\tHI!";?>");
</script>
Como estou sempre conectado a um banco de dados em meus scripts PHP que passam texto diretamente para strings Javascript, confio em real_escape_string para fazer meu trabalho sujo.addlashes() não lida com novas linhas e às vezes elas se infiltram nas strings que estou passando para o Javascript.
Um simples $sql->real_escape_string($string)
torna tudo melhor, escapando de tudo o que o banco de dados exibe em um formato compatível com Javascript.