【发布时间】:2014-08-29 16:30:46
【问题描述】:
我已经看到了一些相关的答案,其中 PHP 的 JSON 字符串中的特定字符被转换为 javascript 友好的版本。 在一些帮助下,我已经走到了这一步:
- Javascript 不能很好地处理反斜杠,实际上这些需要用双反斜杠替换。
- 换行符 \r\n 不能正常工作,要么您需要回车,要么完全删除这些符号。
- 字符串中的双引号需要使用“双反斜杠”而不是单引号进行转义。
- 在路径中被反斜杠转义的正斜杠不需要转义。
下面的非工作 json 示例(在 jsonlint 验证但在 JSON.parse 中失败)
["string\r\n next line \"quoted text\" and \b at path \/var\/opt "]
我需要在替换后转换为跟随以使其工作
["string next line \\"quoted text\\" and \\b at path /var/opt "]
问题
我的问题是我在 php 中的 json 依赖于用户输入,我不知道他们会放什么。 PHP 将使用标准的 json 转换方法并进行验证。
和上面一样,我还应该涵盖其他场景,特别是 unicode 、其他特殊字符等吗?
更新
我的json字符串比这个例子复杂一点,动态变化,一个小例子是
{ "settings.conf": [ "tooltip='dynamic unicode text multiline with \ or \\ or even \" etc '", "value=the value"]}
我在做
var jstring = <?php sanitize_json(json_encode($source_array)); ?>
JSON.parse(jstring);
我的 sanitize_json 函数目前正在执行反斜杠替换并且正在工作,但是我想包含换行符 \r\n。还需要确保js中的json没有其他此类问题。
【问题讨论】:
-
"我的问题是我在 php 中的 json 依赖于用户输入,我不知道他们会放什么。"用户的任何输入都应在处理之前进行清理。
-
您能否再解释一下这个问题?抱歉,但我无法掌握您的第一个字符串在哪里出错 - 它产生了有效的对象(在 JS 中)。您是否允许用户制作他们的 JSON,然后将其保存到 DB,然后您想通过 JSON.parse 将其转换为 JS 对象?
标签: javascript php regex json backslash