2015-04-02 3 views
1

Мне нужно проанализировать пользовательский файл шаблона.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 . '\)).*?([email protected])/'; 
    preg_match_all($contentPattern, $this->fileContents, $content); 
    echo '<pre>'; 
    print_r($content); 
} 

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

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

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

ответ

2

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

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

Невероятно! У меня все еще есть много возможностей для регулярных выражений. Благодаря! – arkhon

Смежные вопросы