【问题标题】:REGEX a JSON style string using any single characterREGEX 使用任何单个字符的 JSON 样式字符串
【发布时间】: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


【解决方案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*)*$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多