如何让json嵌套在双方括号中?

时间:2017-06-10 08:54:30

标签: php json regex preg-match-all

这是我的样本:

dummy json: {json here: "asdas"}
[[table
  {json here: "asdas"}
]]
[[pre 
  {json here: "asdasx"}
]]
[[text {json here: "red"} ]]

我希望输出如下:

{json here: "asdas"}
{json here: "asdasx"}
{json here: "red"}

UPDATE json字符串可能包含大括号。

我只想获得所有的json字符串,但我一直都在失败 我尝试使用#\[\[(table|pre|text).+({.*?}).+\]\]#s,但我得到了以下输出:

array(3) {
  [0]=>
  array(1) {
    [0]=>
    string(126) "[[table
      {json here: "asdas"}
    ]]
    [[pre 
      {json here: "asdasx"}
    ]]
    [[text {json here: "red"} ]]"
  }
  [1]=>
  array(1) {
    [0]=>
    string(5) "table"
  }
  [2]=>
  array(1) {
    [0]=>
    string(18) "{json here: "red"}"
  }
}

然后我用php语法preg_match_all进行上述测试。

4 个答案:

答案 0 :(得分:1)

我能够通过改变你的正则表达式来使代码工作:

\[\[(?:table|pre|text)\s*(\{.*?\})\s*\]\]

请注意,如果您打算使用括号,则需要对其进行转义;你在向我们展示的正则表达式中没有这样做。

<强>代码:

$userinfo = "[[table  {json here: \"asdas\"}]] [[pre {json here: \"asdasx\"}]] [[text {json here: \"red\"} ]]";
preg_match_all ("/\[\[(?:table|pre|text)\s*(\{.*?\})\s*\]\]/", $userinfo, $pat_array);
print $pat_array[1][0]." <br> ".$pat_array[1][1]." <br> ".$pat_array[1][2];

<强>输出:

{json here: "asdas"} <br> {json here: "asdasx"} <br> {json here: "red"}

在这里演示:

Rextester

答案 1 :(得分:1)

这是最快最简单的模式:\[\[\S+\s+\K{.*}Pattern Demo

说明:

\[\[  #Match 2 opening square brackets
\S+   #Match 1 or more non-white-space characters
\s+   #Match 1 or more white-space characters
\K    #Start the fullstring match from this point (avoiding capture group)
{.*}  #Greedily match 0 or more non-line-terminating characters wrapped in curly brackets

*花括号不需要在我的模式中进行转义,因为它们不会被误认为是量词。

考虑到我的代码中的输入值($in),我的模式只需 33 步骤。 Tim的模式采用 116 步骤并使用捕获组,使preg_match_all()的输出数组大两倍。 inarilo的模式采用 125 步骤并使用捕获组。

如果有人特别想拥有一个捕获组,可以使用此方法:/\[\[\S+\s+({.*})/仅花费 36 步骤。

代码(PHP Demo):

$in='dummy json: {json here: "asdas"}
[[table
  {json here: "asd{as}"}
]]
[[pre 
  {json here: "asdasx"}
]]
[[text {json here: "red"} ]]';

echo implode('<br>',(preg_match_all('/\[\[\S+\s+\K{.*}/',$in,$out)?$out[0]:[]));

输出:

{json here: "asd{as}"}<br>{json here: "asdasx"}<br>{json here: "red"}

答案 2 :(得分:0)

试试这个正则表达式:

#^\[\[(?:table|pre|text)\s+(\{.*?\})\s+\]\]$#m

删除了全局修饰符,因为您使用的是preg_match_all。

答案 3 :(得分:0)

以下应该工作:

(\[\[[(table|pre|text) ]*[\n ].*)({.*})

https://regex101.com/r/Yv67gb/1

这会缩小示例范围,以[[table[[pre[[text开头,然后使用{开始json,其结尾为}包含文本介于两者之间。

第2组将是我们的结果。

{json here: "asdas"}
{json here: "asdasx"}
{json here: "red"}