【问题标题】:Escaping quotes in a javascript object generated from PHP在从 PHP 生成的 javascript 对象中转义引号
【发布时间】:2018-04-12 02:33:04
【问题描述】:

我觉得这肯定是一个经常回答的问题的重复,但我找不到解决我特定问题的答案。

我正在通过 PHP 从 MySQL 加载数据,包括一些字符串和 JSON 编码的字符串。此数据可能包含用户输入的特殊字符。

然后我将这些数据合并到一个 PHP 数组中,然后将其 json_encode 并使用 JSON.parse 将其读入 javascript。

我的问题是,这些字符串中的任何一个撇号都会中断 javascript,从而阻止 JSON.parse 完成。

我认为有三种方法可以解决这个问题:

  1. 在将用户输入的数据保存到数据库之前对其进行某种编码
  2. 从 MySQL 加载时转义特殊字符(使用 htmlspecialchars() 或类似的),尽管在加载存储为 JSON 字符串的数据时这会很困难(我想我可以对其进行解码,然后循环并转义特殊字符在每个元素中,然后重新编码)。
  3. 以某种方式转义 javascript 中的特殊字符。但我不知道该怎么做。

我不得不说,特殊字符编码可能是 Web 开发中最令人沮丧的一个方面,因为它会给我带来很多意想不到的错误,而且我很难理解不同的功能以及何时应该使用它们。

编辑:

var feedback = JSON.parse('{"721103":[{"sessionid":"45","feedback":{"praise":["","",""],"development":["","",""]}},{"sessionid":"46","feedback":{"praise":["Test","Test's",""],"development":["","",""]}}') ;

Test's 中的撇号破坏了 javascript

【问题讨论】:

  • 您能否在问题中包含来自phpJSON 回复?
  • @guest271314 查看编辑
  • 您可以在 JSON 字符串中搜索 ' 并将其替换为 \'
  • 你能分享你正在编码的php数组吗
  • 为什么需要JSON.parse('...');?不能直接使用输出对象吗?

标签: javascript php mysql json


【解决方案1】:

我尝试使用有效的实际解决方案编辑@kmoser 的答案在同行评审中被拒绝,所以这就是有效的方法。全部归功于@kmoser:

$json_feedback = preg_replace( preg_quote('/\u/'), '\\\\\\\\u', json_encode( $feedback, JSON_HEX_APOS | JSON_HEX_QUOT ) );

当从 MySQL 数据库中检索数据时,它通过用十六进制字符串替换单引号和双引号来工作。由于我不明白的原因,这仍然破坏了 javascript,所以我做了一个 preg_replace 在转义代码之前添加一个额外的反斜杠。

注意我必须输入多少反斜杠来说服 preg_replace 放入额外的反斜杠以防止 javascript 中断。我也许可以用更少的反斜杠逃脱,这里出现的数字主要是出于对这个愚蠢问题的完全失望!

【讨论】:

    【解决方案2】:

    在存储到数据库之前不要修改用户数据。取回后,您可以随意使用它。

    我假设您使用 PHP 的 json_encode() 函数来生成 JSON 编码的字符串,在这种情况下,您可以使用 JSON_HEX_APOS 选项将撇号编码为 \u0027,例如:

    json_encode( $a, JSON_HEX_APOS )
    

    $a 是您的 PHP 数组。这应该会生成一个没有实际撇号的 JSON 字符串,您可以用撇号将其包围以创建 Javascript 字符串:

    echo "var feedback = JSON.parse('" . json_encode( $a, JSON_HEX_APOS ) . "')";
    

    【讨论】:

    • 这似乎应该是完美的解决方案,但我实现了它,但仍然从看似有效的 JSON 字符串中得到错误:SyntaxError: JSON.parse: expected ',' or '}' after property value in object at line 1 column 20 of the JSON data
    • 字符串为:var praise = [{"comment":"Te\u0027sT\"t","times_selected":"1","id":"31"},{"comment":"","times_selected":"1","id":"32"},{"comment":"","times_selected":"1","id":"33"}]
    • 试试json_encode( $a, JSON_HEX_APOS | JSON_HEX_QUOT )
    • 谢谢。我刚刚这样做了,现在它已经把字符串变成了:[{"comment":"Te\u0027sT\u0022t","times_selected":"1","id":"31"},{"comment":"","times_selected":"1","id":"32"},{"comment":"","times_selected":"1","id":"33"}],它仍然会产生上面描述的语法错误。这真是莫名其妙。
    • 好的,通过在preg_replace 上添加无数个反斜杠,我已经让它工作了。将编辑答案并接受。再次感谢您。
    【解决方案3】:

    这应该可以防止你的 javascript 被破坏:

    var feedback = JSON.parse(`{"721103":[{"sessionid":"45","feedback":{"praise":["","",""],"development":["","",""]}},{"sessionid":"46","feedback":{"praise":["Test","Test's",""],"development":["","",""]}}]}`) ;
    

    它使用 ``,而不是 ''。它们的工作原理相同,但不会相互影响。

    我还纠正了你的 json 语法错误。

    【讨论】:

    • 它仍然是无效的json..您可以在jsonlint.com中检查json是否有效
    • @DhavalChheda Ye,看到了。我对其进行了编辑以具有有效的 JSON。似乎 op 在他的代码中有 2 个问题。
    • @ubj2216 谢谢。无效的json是因为我粘贴到SO的时候删除太多:真实的代码没问题。
    • @ubj2216 我试试看。我想它会起作用,除非,这不太可能,用户在表单中输入一个 `
    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 2010-12-18
    • 2011-12-21
    • 2011-01-01
    • 2011-08-04
    相关资源
    最近更新 更多