PHP在多个自定义标记之间获取文本

时间:2015-04-02 15:27:25

标签: php regex regex-lookarounds

我需要解析自定义模板文件。

假设我的模板文件是这样的。

@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 个答案:

答案 0 :(得分:2)

您可以在一种模式中获得两种匹配,然后将它们组合在一起。您不会显示多行内容,但这会处理它。 array_map('trim', $sections[2])删除了内容两端的空格/换行符:

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