2016-08-19 37 views
3

我有一个包含字符串作为值的php关联数组,我将它编码为JSON并将其存储在html数据属性中。这是由一些JS读取的。将PHP的json_encode()总是使用双引号作为字符串分隔符?

到目前为止这么好。

现在,我需要使用单引号的数据属性,否则上下文切换。

<section id="settings" data-settings='{"some":"val"}'> 
</section> 

的问题是,我可以依靠PHP与双引号总是编码字符串的json_encode()功能?令人惊讶的是,我似乎无法找到关于此的信息。我只能从数组值中找到引用问题的人的文章。

在此先感谢。

+2

根据[ECMA 404 JSON标准](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf),是的,它将始终使用双引号(请参阅图5) –

+1

是的,但字符串本身的单引号会导致问题 – Steve

+2

_“现在,我需要为数据属性使用单引号,否则上下文会切换”_ - 否,您只需要在数据处理之前正确处理数据你把它放到HTML上下文中。 'htmlspecialchars' – CBroe

回答

4

是,作为JSON规范定义的,分隔符将始终为"。但是,值可能包含'个字符,这会破坏您的HTML。为了保持简单,不用担心什么可能会或可能不会构成问题,HTML转义您的价值观!

<section data-settings="<?= htmlspecialchars(json_encode($foo)); ?>"></section> 

无论您输入什么值或如何对它们进行编码,这都可以保证正常工作。请注意,htmlspecialchars默认只会编码",而不是';因此您必须使用"作为HTML中的分隔符(或更改默认转义行为)。

+1

谢谢,这非常有帮助。 – agoldev

0

在许多语言中,双引号只是JSON中的约定 - 标准。所以如果你想用双引号在HTML属性中存储JSON。您可以编码

在PHP

$encoded_json = base64_encode(json_encode($var)); 

在HTML

<section id="settings" data-settings='<?=$encoded_json?>'> 

在JS

var variable = JSON.parse(atob(encoded_json)); 
相关问题