需要驗證的字符串採用以下格式,它不是嚴格的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