字符串之间的Preg_Replace字符

时间:2014-05-08 18:06:02

标签: php regex json preg-replace preg-match

我试图编写一种最有效的方法来从一个包含错误位置引号的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);

由于 提前

1 个答案:

答案 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