regex — PHP получает текст между несколькими пользовательскими тегами

Мне нужно разобрать файл пользовательского шаблона.

Допустим, мой файл шаблона выглядит следующим образом.

@section('section1')
some content
@endsection

@section('section2')
some more content
@endsection

В результате разбора мне нужен следующий результат:

array(
'section1' => 'some content',
'section2' => 'some more content'
);

Я попытался сначала получить имена разделов с помощью этого кода:

$sectionPattern = '/(?<=\@section\().*?(?=\))/';
preg_match_all($sectionPattern, $this->fileContents, $sections);

который работает как ожидалось. Результат выглядит так:

$sections = array(
array(
0 => 'section1',
1 => 'section2'
)
);

Если я пытаюсь получить содержание для каждого раздела с этим кодом:

foreach($sections[0] as $section) {
$contentPattern = '/(?<=\@section\(' . $section . '\)).*?(?=@endsection)/';
preg_match_all($contentPattern, $this->fileContents, $content);
echo '<pre>';
print_r($content);
}

я получаю только пустые массивы, и я не могу понять, почему.

Также, если вы кого-то видите более элегантный способ получить желаемый результат. Я открыт для предложений.

Заранее спасибо.

1

Решение

Вы можете получить оба совпадения в одном шаблоне, а затем объединить их. Вы не показываете контент, являющийся многострочным, но это справится с этим. array_map('trim', $sections[2]) избавляется от пробелов / новых строк в любом конце содержимого:

preg_match_all("/@section\('([^']+)'\)([^@]+)/", $this->fileContents, $sections);
$sections = array_combine($sections[1], array_map('trim', $sections[2]));
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]