Как выбрать вхождения из строки по меткам begin и end?

138
30 июня 2019, 11:50

Есть файл с метками, который определяет структуру документа. Например:

<!-- begin-block-a-1 -->
Содержимое блока block-a-1
    <!-- begin-block-b-1 -->
    Содержимое блока block-b-1
         <!-- begin-block-c-1 -->
         Содержимое блока block-с-1
         <!-- end-block-c-1 -->
         <!-- begin-block-c-2 -->
         Содержимое блока block-с-2
         <!-- end-block-c-2 -->
         <!-- begin-block-c-3 -->
         Содержимое блока block-с-3
         <!-- end-block-c-3 -->
    <!-- end-block-b-1 -->
    <!-- begin-block-b-2 -->
    Содержимое блока block-b-2
    <!-- end-block-b-2 -->
    <!-- begin-block-b-3 -->
    Содержимое блока block-b-3
    <!-- end-block-b-3 -->
<!-- end-block-a-1 -->
<!-- begin-block-a-2 -->
Content in block block-a-2
<!-- end-block-a-2 -->

Можно ли при помощи регулярных выражений и функций PHP превратить такую строку в массив:

 array(1) {
  ["block-a-1"]=>
  array(4) {
    [0]=>
    string(41) "Содержимое блока block-a-1"
    ["block-b-1"]=>
    array(4) {
      [0]=>
      string(41) "Содержимое блока block-b-1"
      ["block-c-1"]=>
      array(1) {
        [0]=>
        string(42) "Содержимое блока block-с-1"
      }
      ["block-c-2"]=>
      array(1) {
        [0]=>
        string(42) "Содержимое блока block-с-2"
      }
      ["block-c-3"]=>
      array(1) {
        [0]=>
        string(42) "Содержимое блока block-с-3"
      }
    }
    ["block-b-2"]=>
    array(1) {
      [0]=>
      string(41) "Содержимое блока block-b-2"
    }
    ["block-b-3"]=>
    array(1) {
      [0]=>
      string(41) "Содержимое блока block-b-3"
    }
  }
}

Здесь метка begin сообщает о начале смыслового блока, а метка end сообщает о завершении смыслового блока.

Моя проблема заключается в составлении правильного регулярного выражения. Пишу так:

'~<!-- begin-(.?) -->(.*?)<!-- end-(.?) -->~s'

но в таком случае совпадение будет такое:

<!-- begin-block-a-1 -->
Содержимое блока block-a-1
    <!-- begin-block-b-1 -->
    Содержимое блока block-b-1
         <!-- begin-block-c-1 -->
         Содержимое блока block-с-1
         <!-- end-block-c-1 -->

А мне нужно такое:

<!-- begin-block-a-1 -->
Содержимое блока block-a-1
    <!-- begin-block-b-1 -->
    Содержимое блокаk block-b-1
         <!-- begin-block-c-1 -->
         Содержимое блока block-с-1
         <!-- end-block-c-1 -->
         <!-- begin-block-c-2 -->
         Содержимое блока block-с-2
         <!-- end-block-c-2 -->
         <!-- begin-block-c-3 -->
         Содержимое блока block-с-3
         <!-- end-block-c-3 -->
    <!-- end-block-b-1 -->
    <!-- begin-block-b-2 -->
    Содержимое блока block-b-2
    <!-- end-block-b-2 -->
    <!-- begin-block-b-3 -->
    Содержимое блока block-b-3
    <!-- end-block-b-3 -->
<!-- end-block-a-1 -->

И такое:

<!-- begin-block-a-2 -->
Содержимое блока block-a-2
<!-- end-block-a-2 -->

Т.е. нужно получать одинаковые группы регулярным выражением.

Answer 1

У меня получалась такое регулярное выражение:

'~<!-- begin-(.*?) -->(.*?)<!-- end-(\1) -->~sg'
READ ALSO
Хранение статей

Хранение статей

Возник вопрос с сохранением статейДопустим мне нужно сохранить статью в БД

106
запуск php-src в отладчике

запуск php-src в отладчике

Хочу запустить примерно такой код из php-src в отладчике Clion:

117
Как отправлять почту с помощью PHP

Как отправлять почту с помощью PHP

Не совсем понимаю как отправлять почту из PHP скриптаВезде разрозненная информация, кто то пишет установить sendmail, кто то пишет что хватит PHPmailer

93