需要验证的字符串采用以下格式,它不是严格的JSON格式,无法使用PHP的JSON编码过程进行验证。请注意,键中的%%是必需的。REGEX使用任何单个字符的JSON样式字符串
// As a single pair
{"%%key%%":"value"}
// Or comma delimited pairs
{"%%key%%":"value","%%key 2%%":"value 2", ...etc...}
当前REGEX成功验证对于上述:
\{"%%[a-zA-Z0-9]+%%":"[a-zA-Z0-9 ]+"(?:,"%%[a-zA-Z0-9]+%%":"[a-zA-Z0-9 ]+")*}
有效实施例:https://regex101.com/r/4y1uEu/1
无效实施例(围绕第二值没有引号):https://regex101.com/r/4y1uEu/2
值需要支持额外的字符,理想情况下任何字符,所以我改变了正则表达式来
\{"%%[a-zA-Z0-9]+%%":".+"(?:,"%%[a-zA-Z0-9]+%%":".+")*}
这对于该字符串不匹配所希望的图案相匹配:https://regex101.com/r/4y1uEu/3
I:
{"%%hello%%":"world","%%foo%%":bar"}
^missing quote
假阳性的例相信的原因是,新的“任何字符”正用于此整个部分: { “你好%% %%”: “世界”, “富%% %%”:酒吧“}
我怎么能以某种方式使 “任意字符” 匹配的结束?这种方法注定失败,因为报价本身就是“任何角色”?
预期结果的一些例子:
{"%%hello%%":"world","%%foo%%":"bar"}
有效
{"%%hello%%":"world lorem","%%foo%%":"bar ipsum"}
有效
{"%%hello%%":"world lo-rem","%%foo%%":"bar ips'um"}
有效
{"%%hello%%":"world lo-rem","%%foo%%":"lorem "ipsum" dolor"}
有效
因此,除非引号“lorem”ipsum“dolor”'中的非转义引号,为什么要保存无效的JSON? – AbraCadaver
'\ {“%% [A-ZA-Z0-9] + %% “:”[^ “] +”(?: “%% [A-ZA-Z0-9] + %%”: “[^”] +“) * \}' – splash58
在值部分使用“允许的所有内容”,并且引号保持未转义状态,{“%% hello %%”:“world”,“%% foo %%”:bar“}对于1有效键值对为键=“%% hello %%”和value =“world”,“%% foo %%”:bar“。避免这种情况的最简单方法是不允许','或'%'在价值部分,或者你需要更清楚地定义为什么价值是无效的,而其他任何东西。 – Tezra