构建一个正则表达式,将JSON值中没有双引号的部分添加双引号
P粉231112437
P粉231112437 2023-08-17 19:06:54
0
1
431

我有很多格式错误的JSON字符串,像这样:

{ "id":23424938, "name":aN, "ref":aN, "jul":aN, "cat":{}, "src":[], "Code":"SA", "type":d, "spec":[i,j], "child":a }

我正在尝试构建一个正则表达式来双引号JSON值,但没有成功。

我最终使用了/":([^"d{[]+?[^,}]?)/,它修复了所有问题,除了数组内的值,例如[i,j],它不会转换为["i","j"]

你能帮我处理括号内的值吗?

https://regex101.com/r/CGskmy/1

P粉231112437
P粉231112437

全部回复 (1)
P粉755863750

这个任务会有一些困难,因为存在歧义。例如,{ "x": [y] }是变成{ "x": "[y]" }还是变成{ "x": ["y"] }?我会假设未加引号的字符串不包含 JSON 控制字符,例如'[', ']', '{', '}', '"', ':', ','

我认为你可以使用命名捕获组来完成这个任务,这是 PHP 中的一个功能,使用 PCRE 可以实现。这需要一些编程来执行替换。通常的preg_replace操作是不够的,因为我们不会替换所有匹配项。

这是我想出来的方法。首先,我匹配引号字符串并忽略它们。其次,我匹配数字并忽略它们。最后,我匹配未加引号的字符串并将其存储在名为“unquoted”的捕获组中。请注意,PCRE 将按照这些替代项的顺序尝试匹配。只有在无法匹配引号字符串和数字时,才会匹配未加引号的字符串。这是这种方法的关键。

一旦我匹配到所有未加引号的字符串,就只需要将输出字符串与替换一起拼接起来。这是通过迭代匹配项并将字符串片段复制到输出中来完成的。

[^{}\[\]":,\s][^{}\[\]":,]*(?
          

我没有处理完整的 JSON 数字语法,也没有处理 JSON 语法,例如truefalsenull。希望这个答案是一个起点,你可以根据自己的需求进行调整。

InSync提供了一个很好的正则表达式,它不使用命名捕获组,而是命令 PCRE 跳过不需要的匹配项。

(?: "(?:[^\"rrreee-\x1F\x7F]|\["\/bfnrt]|\u[\dA-Fa-f]{4})*" | -?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)? ) (*SKIP)(*FAIL) | [^{}[\]:,\s]+
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责声明 Sitemap
    PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!