2017-04-19 81 views
0

需要验证的字符串采用以下格式,它不是严格的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"}有效

+1

因此,除非引号“lorem”ipsum“dolor”'中的非转义引号,为什么要保存无效的JSON? – AbraCadaver

+0

'\ {“%% [A-ZA-Z0-9] + %% “:”[^ “] +”(?: “%% [A-ZA-Z0-9] + %%”: “[^”] +“) * \}' – splash58

+1

在值部分使用“允许的所有内容”,并且引号保持未转义状态,{“%% hello %%”:“world”,“%% foo %%”:bar“}对于1有效键值对为键=“%% hello %%”和value =“world”,“%% foo %%”:bar“。避免这种情况的最简单方法是不允许','或'%'在价值部分,或者你需要更清楚地定义为什么价值是无效的,而其他任何东西。 – Tezra

回答

-1

var pattern = /^{("%%[a-zA-Z0-9]+%%":"([A-z0-9\s\\"'-])*"\s*(,|})\s*)*$/ 
 
str = "{\"%%hello%%\":\"world lo-rem\",\"%%foo%%\":\"lorem \"ipsum\" dolor\"}" 
 
console.log(str+ ' '+pattern.test(str)) 
 
str = "{\"%%hello%%\":\"world lo-rem\",\"%%foo%%\":\"bar ips'um\"}" 
 
console.log(str+ ' '+pattern.test(str)) 
 
str = "{\"%%hello%%\":\"world\",\"%%foo%%\":bar\"}" 
 
console.log(str+ ' '+pattern.test(str)) 
 
str = "{\"%%hello%%\":\"world\",\"%%foo%%\":bar}" 
 
console.log(str+ ' '+pattern.test(str))

使用您的规则有效键和值串延长有效值,这应该适用于你的要求。

^{(“%% [a-zA-Z0-9] + %%”:“([A-z0-9 \ s \\”' - ])“\ s(,|} )\ s *)* $

而对于JSON转义“版本...

^{(“%% [a-zA-Z0-9] + %%”:“([A-z0-9 \ s \\' - ] | \\”)“\ s ,}} \ s *)* $