【问题标题】:How to escape quotes and already escaped quotes in PHP before passing to Javascript?在传递给 Javascript 之前,如何在 PHP 中转义引号和已经转义的引号?
【发布时间】:2011-08-04 13:42:22
【问题描述】:

关于转义单引号和双引号有很多问题,但我没有找到解决我特定问题的答案。

我有一个 PHP 函数,它动态返回一个带有 onClick 事件的图像,该事件调用一个 Javascript 函数,并将对象名称作为参数,如下所示:

$response = "<img src=\"images/action_delete.gif\" onClick=\"confirmDelete("'" . $event->getName() . "'")\"/>"";

Javascript 函数应该在某些时候显示一个确认对话框,如下所示:

confirm('Delete event ' + name + ' ?')

我应该如何在 PHP 中格式化 $response 以确保当用户输入包含 ' 或 " 或 \' 或 \" 的名称时 Javascript 确认不会混乱?

【问题讨论】:

    标签: php javascript quotes double-quotes


    【解决方案1】:

    如果您的输入字符串中有单引号、双引号、斜杠和反斜杠,另一种解决方案对我有用:

    $output = htmlentities(str_replace(array(chr(92), "'"), array(chr(92) . chr(92), "\'"), $input));
    

    类似:

     onClick=\"confirmDelete('" . $output . "')\"
    

    感谢nicja!

    【讨论】:

      【解决方案2】:

      您可以使用 htmlspecialchars 或 htmlentities 转义 php 中的任何引号,但这并不能解决单引号问题,即使设置了 ENT_QUOTES。

      做一些测试,我看到以下应该可以工作,虽然它可能不是很优雅:

      $name = htmlentities(str_replace("'", "\'", $event->getName()));
      $response = "<img src=\"images/action_delete.gif\" onClick=\"confirmDelete('" . $name . "')\"/>";
      

      希望有帮助

      【讨论】:

      • 我扩展了你的代码。 htmlentities(str_replace("'", "\'",str_replace("\'","\\\'",$input)));so 如果用户输入了\',对话框实际上会显示\'。我不知道如何为 \" 做同样的事情,但至少这可以防止确认对话搞砸。感谢您的建议。
      • 啊,我没想到用户输入了转义引号。以下应处理所有 4 种情况,并将其全部合并为 1 个 str_replace() 调用。如果您还转义 " 字符,您可能不需要 htmlentities() 调用,但处理 & 和其他特殊字符可能很方便。尝试:str_replace(array("\'", '\"', '"', "'"), array("'", '"', '\"', "\'"), $input);
      • 不会用“'”替换“\'”,然后用“\'”替换“'”只是切换问题吗?还是该功能不能以这种方式工作?也许我的问题并不完全清楚。我不想清理传统意义上的输入,我实际上希望警报显示用户输入的内容与他们输入的内容完全相同。我特别难以同时替换 \" 中的反斜杠和双引号,因此我可以将其传递给 JavaScript。
      • htmlentities(str_replace(array("\'", '\"', '"', "'"), array("\\\'", '\\"', '\"', "\'"), $input)); 似乎完成了我想做的事情,尽管我无法真正解释为什么 htmlentities 会有所作为。
      • 有什么理由不能只使用addslashes() 函数?
      【解决方案3】:

      非常安全的替代方案,还免费为您提供手形光标

      <script> 
      function confirmDelete(idx) {
        if (confirm(document.getElementById("msg"+idx).innerHTML)) {
          location="delete.php?idx="+idx;   
        }   
        return false 
      }
      <span id="msg1" style="display:none"><?PHP echo $event->getName(); ?></span> 
      <a href="#" onClick="return confirmDelete(1)"><img src="images/action_delete.gif" style="border:0" /></a>
      

      【讨论】:

      • 感谢您的建议!这看起来像是我将来可能会使用的东西,但恐怕在我目前的情况下它需要进行过于激烈的重写。我希望使用某种函数来简单地转义这 4 个字符(组合),就像 json_encode() ThiefMaster 建议的那样。
      【解决方案4】:

      使用json_encode() 处理字符串。这将确保它是一个有效的 JavaScript 表达式。

      【讨论】:

      • 在我的示例中使用和转义引号的方式是否有任何问题,当简单地应用于 $event->getName() 时会导致这不起作用?
      猜你喜欢
      • 1970-01-01
      • 2014-03-02
      • 2014-02-22
      • 2017-01-30
      • 2011-12-21
      • 1970-01-01
      • 2012-10-07
      相关资源
      最近更新 更多