pcre — получить внутри родительских блоков в PHP регулярных выражений

привет у меня есть 2 родительских (или более …) блока и много дочерних блоков внутри них.

Block1 {

blockchild1 {

}

blockchild2 {

}

, ...
}

Block2 {

blockchild1 {

}

blockchild2 {

}

, ...
}

я хочу использовать PHP регулярное выражение и получить сначала все родительские блоки внутри

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

но это регулярное выражение останавливается, когда прибывают к первому ребенку близко } означает, что первое получение данных

Block1 {

blockchild1 {

}

но я хочу получить что-то подобное

array 1 = Block1
array 2 = blockchild1 {

}

blockchild2 {

}

, ...

я хочу, чтобы регулярные выражения передать дочерние блоки [}] и получить все внутри блока родителей. мое регулярное выражение PCRE (PHP)

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, поэтому шаблон является рекурсивным.

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).
Это регулярное выражение не работает с вложенными блоками в дочерних блоках и не работает с любым другим содержимым внутри родительских блоков, кроме блоков. Но вы не упомянули ничего из этого.

Вот онлайн версия.

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 в массив
0
По вопросам рекламы [email protected]