привет у меня есть 2 родительских (или более …) блока и много дочерних блоков внутри них.
Block1 {
blockchild1 {
}
blockchild2 {
}
, ...
}
Block2 {
blockchild1 {
}
blockchild2 {
}
, ...
}
я хочу использовать PHP регулярное выражение и получить сначала все родительские блоки внутри
([a-z-0-9]*)\s*[{](.*?)[}]
но это регулярное выражение останавливается, когда прибывают к первому ребенку близко }
означает, что первое получение данных
Block1 {
blockchild1 {
}
но я хочу получить что-то подобное
array 1 = Block1
array 2 = blockchild1 {
}
blockchild2 {
}
, ...
я хочу, чтобы регулярные выражения передать дочерние блоки [}]
и получить все внутри блока родителей. мое регулярное выражение PCRE (PHP)
Вам нужно использовать рекурсивный шаблон:
$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, поэтому шаблон является рекурсивным.
Попробуй это:
$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
).
Это регулярное выражение не работает с вложенными блоками в дочерних блоках и не работает с любым другим содержимым внутри родительских блоков, кроме блоков. Но вы не упомянули ничего из этого.
Вот онлайн версия.
$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 (
),
),
)