我正在尝试编写一种最有效的方法,从json提要中转义双引号(“),该提要在不正确的位置包含引号。
即
{“count”:“1”,“query”:“www.mydomain.com/watchlive/type/livedvr/event/69167/“sTyLe=X:eX/**/pReSsIoN(window.location=56237)”,“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/“sTyLe=X:eX/**/pReSsIoN(window.location=56237)”,“error”:“500”}
preg_match('/(查询": ")(.*)(", "错误)/',$缓冲区,$匹配);
提前感谢
使用以下表达式匹配并替换:
(?:"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