提问者:小点点

Preg_替换字符串之间的字符


我正在尝试编写一种最有效的方法,从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('/(查询": ")(.*)(", "错误)/',$缓冲区,$匹配);

提前感谢


共1个答案

匿名用户

使用以下表达式匹配并替换:

(?:"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