我试图编写一种最有效的方法来从一个包含错误位置引号的json feed中转义双引号(“)。
即
{“count”:“1”,“query”:“www.mydomain.com/watchlive/type/livedvr/event/69167/"%20%20sTyLe=X:eX/**/pReSsIoN(window。 location = 56237)%20“”,“error”:“500”}
上面有三个键 - 计数,查询和错误。 “查询”中的值无效,因为额外的双引号呈现无效的json。
如果我使用\来转义它,那么json是有效的并且可以由PHP引擎解析,但由于json可以有超过5000组数据,我不能手动去更改有问题的行。
我知道使用preg_match和str_replace的组合可以工作,但它的代码非常混乱且无法维护。我需要reg_ex来使用类似的东西
$ buffer ='{“count”:“1”,“query”:“www.mydomain.com/watchlive/type/livedvr/event/69167/"%20%20sTyLe=X:eX/**/ pReSsIoN(window.location = 56237)%20“”,“error”:“500”}'
preg_match('/(query“:”)(。*)(“,”error)/',$ buffer,$ match);
由于 提前
答案 0 :(得分:2)
使用this expression进行匹配和替换:
(?:"query"\s*:\s*"|(?<!\A)\G)[^"]*\K"(?=.*?",)
\"
在PHP中,这将使用preg_replace()
:
$buffer = preg_replace('/(?:"query"\s*:\s*"|(?<!\A)\G)[^"]*\K"(?=.*?",)/', '\"', $buffer);
var_dump($buffer);
<强>解释强>
(?: # Start non-capturing group
"query"\s*:\s*" # Match "query":" literally, with optional whitespace
| # OR
(?<!\A) # Make sure we are not at the beginning of the string
\G # Start at the end of last match
) # End non-capturing
[^"]* # Go through non-" characters
\K # Remove everything to the left from the match
" # Match " (this will be the only thing matched and replaced)
(?= # Start lookahead group
.*?", # Lazily match up until the ", (this is the end of the JSON value)
) # End lookahead group