preg_match从json字符串中删除转义

时间:2015-05-02 23:03:42

标签: php regex json

我正在尝试使用php的json_decode函数解析一些json数据。但是,我需要在解码之前从这个长字符串中删除某些前导和尾随字符。因此,我使用preg_match在解码之前删除这些字符。出于某种原因,preg_match在遇到下面的子串时(在字符串的中间)正在改变转义

{content: \\\"\\200B\\\"}

在preg_match之后,上面的字符串如下所示:

{content: \\"\200B\\"}

因此,json_decode失败。

仅供参考,preg_match模式如下所示:

(?<=remove_these_leading_char)(.*)(?=remove_these_trailing_char)

好的,所以这里是基于提出的问题的附加信息:

  1. 为什么三重逃逸?修复三重escpaing等答案是我没有任何控制权。它不是由我的代码生成的。
  2. 原始字符串不完全符合json。它有几个需要删除的前导和尾随字符。因此我必须使用正则表达式。该字符串的格式如下:

    returnedHTMLdata({JSON_OBJECT},XX);

  3. 看起来这种行为不仅限于preg_match。甚至substr也会这样做。

1 个答案:

答案 0 :(得分:0)

看起来你有一些JSON with padding。要删除函数名和括号,保留(未转义的)json对象,可以执行以下操作:

$str = <<<'EOS'
returnedHTMLdata({content: \\\"\\200B\\\", foo: \\\"bar\\\", \"baz\": \\\"fez\\\"},xx);
EOS;
$str = preg_replace('/.+?({.+}).+/','$1', $str);
echo $str;

输出:

{content: \\\"\\200B\\\", foo: \\\"bar\\\", \"baz\": \\\"fez\\\"}

请注意,即使您设法成功取消此字符串,json_decode也需要密钥 - 例如&#34;内容&#34; - 用双引号括起来,因此在调用该函数之前需要修改JSON字符串/对象。或者我想你可以使用旧的Services_JSON包来解码它,我相信它没有这个要求。