当前位置: 首页 > 面试题库 >

如何用撇号而不是引号json_decode无效的JSON

欧阳炜
2023-03-14
问题内容

样例代码:

<?php

$json = "['foo', 'bar']";

var_dump( json_decode($json) );

它适用于 PHP 5.5.3, 但对于较低版本的PHP则失败

它可以在我的装有PHP 5.5.3的计算机上使用,但是在其他地方都无法使用。

我知道这是错误的JSON,但我的网络服务向我提供了带有'符号的JSON 和"

['foo', "bar", {'test': "crazy \"markup\""}]

沙盒

如何在PHP 5.3中使用撇号解析JSON数据显然,我要解析的原始JSON更复杂。

(我无法在生产服务器上升级PHP,也无法从Web服务获取正确的JSON)


问题答案:

这是此问题的替代解决方案:

function fixJSON($json) {
    $regex = <<<'REGEX'
~
    "[^"\\]*(?:\\.|[^"\\]*)*"
    (*SKIP)(*F)
  | '([^'\\]*(?:\\.|[^'\\]*)*)'
~x
REGEX;

    return preg_replace_callback($regex, function($matches) {
        return '"' . preg_replace('~\\\\.(*SKIP)(*F)|"~', '\\"', $matches[1]) . '"';
    }, $json);
}

在两个方面,此方法比h2ooooooo的功能更健壮:

  • 通过对它们应用附加的转义,它可以保留在单引号字符串中出现的双引号。h2o的变体会将其替换为双引号,从而更改字符串的值。
  • 它将正确处理转义的双引号\",为此h2o的版本似乎陷入了无限循环。

测试:

$brokenJSON = <<<'JSON'
['foo', {"bar": "hel'lo", "foo": 'ba"r ba\"z', "baz": "wor\"ld ' test"}]
JSON;

$fixedJSON = fixJSON($brokenJSON);
$decoded = json_decode($fixedJSON);

var_dump($fixedJSON);
print_r($decoded);

输出:

string(74) "["foo", {"bar": "hel'lo", "foo": "ba\"r ba\"z", "baz": "wor\"ld ' test"}]"
Array
(
    [0] => foo
    [1] => stdClass Object
        (
            [bar] => hel'lo
            [foo] => ba"r ba"z
            [baz] => wor"ld ' test
        )
)


 类似资料:
  • 本文向大家介绍xml 撇号和引号,包括了xml 撇号和引号的使用技巧和注意事项,需要的朋友参考一下 示例 属性值可以用单引号或双引号出现。适当的字符必须转义。            

  • 问题内容: 我尝试过将文本与utf8相互转换,这似乎没有帮助。 我越来越: 它应该是: 我从此网址获取此数据。 问题答案: 转换为HTML实体: 有关更多编码选项,请参阅mb_convert_encoding的文档。

  • 问题内容: 该 逃生() 函数,已被废弃,取而代之 encodeURIComponent方法 ,但 encodeURIComponent方法 不编码单引号/单引号字符。我需要使用AJAX格式来避免姓氏(例如“ O’Neill”)中的撇号。他们为什么要消除他们试图改善的东西的能力? 编辑: 因此,这是一个代码示例,可以更彻底地说明问题。因此,您可以看到姓“ O’Neill”包含一个撇号,当在url中

  • 问题内容: 我有一个用户表格。如果用户键入带有’or “作为字符串一部分的字符串,我没有问题。表单已提交并正确保存到数据库。我的问题是当我重新加载页面时(所有条目都可以修改,并在显示之前加载到JSP的列表中)。在加载页面时,我收到一条错误消息: 我需要做些什么来转义该字符串以在前端显示它? 这是我在前端使用的代码,以读取数据并将其存储在JavaScript对象中。我不确定我应该在哪里逃脱。导致问题

  • 问题内容: 以下两个查询给出完全不同的结果的原因是什么? 我已经在Google周围搜索了反引号和撇号(又称为单引号)之间的区别,但是我找不到任何迹象表明为什么对于像上列这样的列名它们会有不同的解释。 难道实际上不是将后一个查询中的单引号字符串解释为列名,而是解释为任意字符串文字,可以说其为“ 1”吗?如果是这样,要找到任何有关撇号含义的页面并不容易。 问题答案: “价格”(撇号或引号)是一个字符串

  • 问题内容: 我需要在逗号处将字符串输入分解为数组。但是,字符串在引号内包含逗号。 输入: 返回$ linemysql为: 我如何才能做到这一点,而爆炸会忽略引号内的逗号? 问题答案: 由于您使用的是逗号分隔的值,因此可以使用。 将返回: