0

您好,我有 2 个父(或更多...)块和其中的许多子块。

Block1 {

    blockchild1 {

    }

    blockchild2 {

    }

    , ...
}

Block2 {

    blockchild1 {

    }

    blockchild2 {

    }

    , ...
}

我想使用 php regex 并首先获取所有父块

([a-z-0-9]*)\s*[{](.*?)[}]

但是这个正则表达式在到达第一个子块关闭时停止}意味着第一个数据接收是

Block1 {

    blockchild1 {

    }

但我想得到这样的东西

array 1 = Block1
array 2 = blockchild1 {

    }

    blockchild2 {

    }

    , ...

我希望正则表达式传递子块[}]并将所有内容都放在父块中。我的正则表达式是 PCRE (PHP)

4

3 回答 3

0

试试这个:

$str = 'Block1 {

    block1child1 {

    }

    block1child2 {

    }

    block1child3 {

    }
}

Block2 {

    block2child1 {

    }

    block2child2 {

    }

}';

$sub = '(\s*[a-z-0-9]*\s*{.*?}\s*)*';
preg_match_all("/([a-z-0-9]*)\s*{($sub)}/sim", $str, $matches, PREG_SET_ORDER);

var_dump($matches);

我使用变量$sub来阐明方法。它返回:

$matches[0][1] = 'Block1';
$matches[0][2] = '



block1child1 {



}



block1child2 {



}



block1child3 {



}

';

它包含 Block2 的正确输出(1的索引$matches)。此正则表达式不适用于子块中的嵌套块,也不适用于父块中除块之外的任何其他内容。但是你没有提到任何这些。

这里是网络版

于 2016-12-07T05:56:27.763 回答
0
$str = 'Block1 {

    block1child1 {

    }

    block1child2 {

    }

    block1child3 {

    }
}

Block2 {

    block2child1 {

    }

    block2child2 {

    }

}';

$str = preg_replace('([\w\d]+)', '"$0"', $str);
$str = str_replace(' {', ': {', $str);
$str = str_replace('}', '},', $str);
$str = preg_replace('/\}\,[.\n]*?}/', '}}', $str);


$str =  json_decode('{' . substr($str, 0, strlen($str) - 1)  . '}', true);

var_export($str);

array (
  'Block1' => 
  array (
    'block1child1' => 
    array (
    ),
    'block1child2' => 
    array (
    ),
    'block1child3' => 
    array (
    ),
  ),
  'Block2' => 
  array (
    'block2child1' => 
    array (
    ),
    'block2child2' => 
    array (
    ),
  ),
)
  1. 将字符串转换为 JSON
  2. 将 JSON 转换为数组
于 2016-12-07T06:55:52.030 回答
0

您需要使用递归模式:

$pattern = '~(\w+)\s*{([^{}]*(?:{(?2)}[^{}]*)*)}~';

细节:

~ # delimiter
(\w+) # capture group 1: block name
\s* # eventual whitespaces
{
(   # capture group 2
    [^{}]* # all that isn't a curly bracket
    (?:
        { (?2) } # reference to the capture group 2 subpattern
        [^{}]*
    )*
)
}
~

请注意,对捕获组 2 的引用位于捕获组 2 本身内部,这就是模式是递归的原因。

于 2016-12-07T07:00:52.300 回答