Мне нужно разобрать файл пользовательского шаблона.
Допустим, мой файл шаблона выглядит следующим образом.
@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);
}
я получаю только пустые массивы, и я не могу понять, почему.
Также, если вы кого-то видите более элегантный способ получить желаемый результат. Я открыт для предложений.
Заранее спасибо.
Вы можете получить оба совпадения в одном шаблоне, а затем объединить их. Вы не показываете контент, являющийся многострочным, но это справится с этим. array_map('trim', $sections[2])
избавляется от пробелов / новых строк в любом конце содержимого:
preg_match_all("/@section\('([^']+)'\)([^@]+)/", $this->fileContents, $sections);
$sections = array_combine($sections[1], array_map('trim', $sections[2]));
Других решений пока нет …