在PHP中将JSON字符串中的双引号替换为单引号

6

我有一个包含一些HTML和它的属性的JSON字符串。我试图在这个字符串中转义或替换双引号为单引号。我的代码可以处理一些HTML属性,但不是全部。

我的例子:

$json='{"en":"<b class="test" size="5" >Description</b>"}';
$json=preg_replace('/([^:,{])"([^:,}])/', "$1".'\''."$2",$json);
echo htmlspecialchars($json);
//ouput: {"en":"<b class='test' size='5" >Description</b>"}


Needed result:

{"en":"<b class='test' size='5' >Description</b>"}

有趣的问题。你尝试过 https://regex101.com/ 吗? - Blue Box
1
你的示例中不是一个 JSON 字符串。是什么创建了这样奇怪的字符串?你能修复它,让它给你真正的 JSON(用 " 正确转义)吗? - Yuliy
2个回答

7

我希望这能像预期的那样工作 ([^{,:])"(?![},:])

$json='{"en":"<b class="test" size="5" >Description</b>"}';
$json=preg_replace('/([^{,:])"(?![},:])/', "$1".'\''."$2",$json);

结果

{"en":"<b class='test' size='5' >Description</b>"}

不错的解决方案。我们应该在示例字符串中添加说明,最后一个引号的问题是,它前面的字符已经被前一个匹配使用了。您的解决方案使用了“负向先行断言”。这不会消耗字符。问题解决了。 - Blue Box
虽然你的代码适用于大多数典型情况,但如果在 JSON 值中有引号和逗号,闭合引号将不会被转义。例如:{"en":"grass and "flowers", "sky""} 将变成 {"en":"grass and \"flowers", \"sky\""} - jackJoe
谢谢你指出这个问题。请告诉我正确处理你的情况的方法,我会测试并更新我的答案。 - Florian

-1
尝试这个: str_replace('"', "'", $json);
$json='{"en":"<b class="test" size="5" >Description</b>"}';
$json=str_replace('"', "'",$json);
echo htmlspecialchars($json);

输出将会是:{'en':'<b class='test' size='5' >描述</b>'}


1
感谢您的回答。JSON 的值仍必须带有双引号。 - ferhado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接