【发布时间】:2017-04-19 18:23:50
【问题描述】:
需要验证的字符串格式如下,严格来说不是JSON,无法使用PHP的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
值需要支持其他字符,最好是任何字符,所以我将 REGEX 更改为
\{"%%[a-zA-Z0-9]+%%":".+"(?:,"%%[a-zA-Z0-9]+%%":".+")*}
匹配与所需模式不匹配的字符串:
{"%%hello%%":"world","%%foo%%":bar"}
^ missing quote
误报示例:https://regex101.com/r/4y1uEu/3
我相信原因是这个整个部分都使用了新的“任何字符”: {"%%hello%%":"世界","%%foo%%":bar"}
我怎样才能以某种方式使“任何字符”匹配结束?由于引号本身是“任何字符”,这种方法注定要失败吗?
一些预期结果的例子:
{"%%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? -
\{"%%[a-zA-Z0-9]+%%":"[^"]+"(?:,"%%[a-zA-Z0-9]+%%":"[^"]+")*\} -
在值部分包含“所有允许的内容”,并且引号未转义,{"%%hello%%":"world","%%foo%%":bar"} 是使用 1 个键值对作为 key="%%hello%%" 和 value = "world","%%foo%%":bar" 有效。避免这种情况的最简单方法是在值部分中不允许使用 ',' 或 '%',或者您需要更清楚地定义为什么该值无效而其他任何值都是无效的。
标签: php json regex string validation