【问题标题】:How to escape Javascript code that is echoed in PHP如何转义在 PHP 中回显的 Javascript 代码
【发布时间】:2011-05-20 00:33:25
【问题描述】:

我有这段代码是从 php 页面的 jquery Data 对象中捕获的。

echo "
    var $d = $('<div/>', {
        id: 'hi' + $('#textResp').children().length,
        class: 'eventdiv',
        html: 'hello'
    }).hide().fadeIn(3000);

    $('#textResp').append($d)

";

问题是,'s 没有被转义。我曾尝试使用 /' 转义,但出现错误。我确定我做错了,有谁知道在哪里放 /' 而不是 '?

【问题讨论】:

  • 等等,为什么会出错呢?你有 ' 里面的 ",它不应该做任何事情......
  • 可怕的事情可能正在发生,因为 PHP 将所有这些 $ 符号作为 PHP 变量进行插值,这会完全搞砸你的输出。使用单引号回显。根据我的经验,将 PHP 变量放入其中的最简单和最安全的方法是使用 json_encode
  • 为什么没有人建议?&gt; whatever &lt;?

标签: php javascript jquery ajax escaping


【解决方案1】:

您可以使用php nowdoc 代替引号,这会简化事情:

echo <<<'DOC'
    var $d = $('<div/>', {
        id: 'hi' + $('#textResp').children().length,
        class: 'eventdiv',
        html: 'hello'
    }).hide().fadeIn(3000);

    $('#textResp').append($d)
DOC;

然后在里面使用你想要的任何东西(quote 或 dquote)。当然,这是未解析的,因此如果 $d 实际上指的是 php var,那么您就会遇到问题。

【讨论】:

  • NOWDOC 是一个未被充分利用的 PHP 特性
【解决方案2】:

您的撇号实际上看起来不错。但是,在双引号字符串中,PHP 会将任何以美元符号开头的字符串作为变量求值,并且不会产生所需的结果。尝试将$ 的jquery 相关实例替换为\$。像这样:

echo "
    var \$d = \$('<div/>', {
        id: 'hi' + \$('#textResp').children().length,
        class: 'eventdiv',
        html: 'hello'
    }).hide().fadeIn(3000);

    \$('#textResp').append(\$d)

";

【讨论】:

  • 第二行:var $d = 看起来像是一个 jQuery var :P
  • @jnpcl:你怎么能确定呢?
  • @Asaph:代码的上下文。如果您假设 $d 是 PHP 变量,那是没有意义的。
  • @Asaph:使用 jQuery 时,以这种方式命名变量 ($d) 可以让您更轻松地在该变量上使用 jQuery 函数:$d.func() 而不是 $(d).func()。在我看来,这比让$d 成为用于动态命名 javascript 变量的 PHP 变量更有可能发生这种情况。
  • @jnpcl $d 是名为 ...$d 的变量/属性的有效 JS 标识符(很可能是 var d = ...)。没有“jQuery 魔法”,它隐含 意味着$(d)(它评估d 并将其用作函数对象应用程序的参数,[希望] 由评估$)。然而,$var 约定在 JavaScript 中是不鼓励的,并且可能来自在 PHP/Perl 中使用 sigils。不过,我确实同意——希望——$d 并不是一个 PHP 变量,因为那种“动态”代码听起来像一团糟;-)
【解决方案3】:

在 php 中使用 json_encode 函数,它的行为类似于 rails 中的 escape_javascript 函数。

只需将字符串参数传递给json_encode 函数,它就会为您返回转义字符串,请参见下面的示例代码:

<?php
$form_html  = <<HTML
<form action='...' ...>
    <input type='...' name='...' ...>
    ...
</html>
HTML;
?>

var form_html = <?php echo json_encode($form_html); ?>;
$('.remote#create_form').html(form_html).slideDown();

【讨论】:

    【解决方案4】:

    您需要在所有's 之前使用\

    然而,这令人费解,为什么你觉得你需要转义字符?看来您只是在回显此输出,如果这是在 &lt;script /&gt; 标记之间,您应该没问题。

    【讨论】:

    • 嗯,它不是,这就是为什么我在第二段中说它不应该是必需的。但我向他表示,他的转义字符错误,应该是 \。我觉得这不值得投反对票,考虑到我是第一个做出回应的人,他应该以某种身份使用 \。
    • 是的,但那是后来的。顺便说一句,我没有投反对票。并给出了一个偏移量;-)
    【解决方案5】:

    PHP 将尝试扩展变量$name,这些变量出现在用双引号括起来的字符串中。由于$d 在 PHP 解释器中看起来像一个变量,它会尝试用变量的值替换它。

    假设您没有在任何地方定义$d,这将产生一个空白空间,并且可能会产生一个通知(如果您使用的是错误级别 E_NOTICE)。

    为防止这种情况发生,请使用反斜杠转义美元符号(将 $ 替换为 \$

    【讨论】:

      【解决方案6】:

      在字符串构造中使用单引号。仅当您明确包含要评估的变量时才使用双引号。 PHP 正在尝试评估您在其中拥有的所有 $ 引用。通过使用单引号,可以避免很多转义问题。

      echo '
          var $d = $("<div/>", {
              id: "hi" + $("#textResp").children().length,
              class: "eventdiv",
              html: "hello"
          }).hide().fadeIn(3000);
      
          $("#textResp").append($d)
      
      ';
      

      【讨论】:

        猜你喜欢
        • 2015-03-01
        • 1970-01-01
        • 2013-02-02
        • 2014-10-16
        • 1970-01-01
        • 2013-12-13
        • 2010-11-19
        • 2014-06-03
        相关资源
        最近更新 更多