2017-04-19 77 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 *)* $