首页 文章

将PHP字符串传递给JavaScript变量(并转义换行符)[复制]

提问于
浏览
351

这个问题在这里已有答案:

编码PHP字符串以输出到JavaScript变量的最简单方法是什么?

我有一个PHP字符串,其中包括引号和换行符 . 我需要将此字符串的内容放入JavaScript变量中 .

通常,我只是在PHP文件中构建我的JavaScript,àla:

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

但是,当 $myVarValue 包含引号或换行符时,这不起作用 .

14 回答

  • 20

    扩展别人的答案:

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

    使用json_encode()要求:

    • PHP 5.2.0或更高版本

    • $myVarValue 编码为UTF-8(当然还有US-ASCII)

    由于UTF-8支持完整的Unicode,因此动态转换应该是安全的 .

    请注意,因为 json_encode 转义正斜杠,所以即使包含 </script> 的字符串也会安全转义,以便使用脚本块进行打印 .

  • 26

    用JSON编码

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

    我遇到了类似的问题,并了解以下是最佳解决方案:

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

    然而,micahwittman发布的link表明存在一些较小的编码差异 . PHP的 rawurlencode() 函数应该符合RFC 1738,而Javascript的 decodeURIComponent() 似乎没有这样的努力 .

  • 481

    偏执狂版本:Escaping every single character .

    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: json_encode() 可能不合适的原因是,有时候,您需要阻止生成 " ,例如

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

    要么

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

    Micah的解决方案适合我,因为我必须定制的网站不是UTF-8,所以我不能使用json;我投了票,但我的代表不够高 .

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

    您可以将其插入隐藏的DIV中,然后将DIV的innerHTML分配给JavaScript变量 . 你不必担心逃避任何事情 . 请确保不要将破碎的HTML放在那里 .

  • 19

    你可以试试

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

    尽管 addslashes() 不要运行它;如果您在HTML页面的上下文中,HTML解析器仍然可以看到 </script> 标记,甚至是中间字符串,并假设它是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>
    
  • 3
    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    
  • 10

    用htmlspecialchars

    描述

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

    某些字符在HTML中具有特殊意义,如果要保留其含义,则应由HTML实体表示 . 此函数返回一个字符串,其中包含一些转换;所做的翻译是对日常网络编程最有用的翻译 . 如果您需要翻译所有HTML字符实体,请改用htmlentities() .

    此功能可用于防止用户提供的文本包含HTML标记,例如在留言板或留言簿应用程序中 .

    执行的翻译是:

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

  • 3

    我不确定这是不好的做法还是不行,但我的团队和我一直在使用混合的HTML,JS和php解决方案 . 我们从我们想要拉入JS变量的PHP字符串开始,让我们调用它:

    $someString
    

    接下来,我们使用页内隐藏的表单元素,并将其值设置为字符串:

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

    然后通过document.getElementById定义JS var很简单:

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

    现在,您可以在任何想要获取PHP字符串值的地方使用JS变量“moonUnitAlpha” . 这对我们来说似乎非常有效 . 我们将看看它是否适用于大量使用 .

  • 6

    如果您使用模板引擎来构建HTML,那么您可以随意填写它!

    看看XTemplates . 这是一个不错的开源轻量级模板引擎 .

    您的HTML / JS看起来像这样:

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

相关问题