【问题标题】:How to escape string from PHP for javascript?如何从 PHP 中为 javascript 转义字符串?
【发布时间】:2011-08-16 22:07:22
【问题描述】:

让我们想象一个表单编辑器,它可以编辑可用值。如果数据包含" 字符(双引号),它会“破坏”HTML 代码。我的意思是,让我们检查一下代码:所以我生成了 HTML:

onclick="var a = prompt('New value: ', '<?php echo addslashes($rec[$i]); ?>'); if (a != null)....

结果

onclick="var a = prompt('New value: ', 'aaaa\"aaa'); if (a != null) { v....

这使得 JS 无法工作,从而破坏了代码。使用单个 qoute ' 它可以正常工作。 mysql real escape 也是如此。 如何转义任何字符串以免破坏 javascript?


json_encode 看起来不错,但我一定是做错了什么,它仍然很糟糕:这是 Firefox 看到它的屏幕截图 - 它插入了一个“糟糕的”双引号!该值只是一个简单的数字:

http://img402.imageshack.us/img402/5577/aaaahf.gif

我确实用过:

('Ird be az új nevet:', <?php echo json_encode($rec['NAME']); ?>); if (a) { 

【问题讨论】:

标签: php javascript escaping addslashes


【解决方案1】:

onclick 属性的值应该像任何其他 HTML 属性一样使用htmlspecialchars() 进行转义。代码中的实际 Javascript 字符串应使用json_encode() 进行编码。例如:

<?php
$message = 'Some \' problematic \\ chars " ...';
$jscode = 'alert('.json_encode($message).');';
echo '<a onclick="' . htmlspecialchars($jscode) . '">Click me</a>';

话虽如此... onclick(或任何其他事件)属性是如此 2005。帮自己一个忙,将您的 javascript 代码与 html 代码分开,最好是外部文件,并使用 DOM 函数(或 jQuery)附加事件,它很好地包装了它)

【讨论】:

  • 感谢您修复错字,但我拒绝了它,因为我在您编辑后添加了最后一段。我手动添加了您的更改。
【解决方案2】:

我真的只是重新措辞@Marshall House 在这里所说的,但是:

在 HTML 中,双引号 (") 总是 结束一个属性,而不管反斜杠如何 - 所以它会看到:onclick="var a = prompt('New value: ', 'aaaa\"。@Marshall 提供的解决方案是将您的代码分开到一个函数中。这样你就可以毫无问题地将转义的 PHP 打印到其中。

例如:

<script>
    // This is a function, wrapping your code to be called onclick.
    function doOnClickStuff() {
        // You should no longer need to escape your string. E.g.:
        //var a = prompt('new value:','<?php echo $rec[$i]; ?>');
        // Although the following could be safer
        var a = prompt('new value:',<?php json_encode($rec[$i]); ?>);
        if (a) { <!--javascript code--> }
        else { <!--javascript code--> }
    }
</script>
<someelement onclick="doOnClickStuff();"> <!-- this calls the javascript function doOnClickStuff, defined above -->

【讨论】:

  • addslashes() 在将字符串编码为 javascript 时并不总是按预期工作。 json_encode() 更可靠。请注意,它会在字符串周围添加引号,因此从 json_encode() 返回的值不应包含在另一个 ''
【解决方案3】:
onclick="var a = prompt('New value: ', 'aaaa\"aaa'); if (a != null) { v....

您的问题以粗体突出显示。 你不能引用变量声明 一旦将其删除,您就不需要转义双引号,因为它在单引号内。 应该是这样的 -

onclick="newFunc();"
<script>
function newFunc()  {
var a = prompt('New value: ', 'aaaa"aaa'); 
if (a != null) { v....
}
</script>

【讨论】:

  • 恐怕我不太明白。好的,我不会使用任何转义,但它现在 onclick="var a = prompt('New value: ', 'áááá"áááá'); if (a != null) { 又被宠坏了
  • 唯一应该放在 onclick 参数中的就是调用一个处理所有事情的函数。像这样
【解决方案4】:
...onclick="new_func();"...
<script>
function new_func() {
    var a = prompt('new value:','<?php code; ?>');
    if (a) { <!--javascript code--> } else { <!--javascript code--> }
}
</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-16
    • 2014-01-27
    • 1970-01-01
    • 2012-03-12
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    相关资源
    最近更新 更多