Регулярка для взятия нескольких блоков

Тема в разделе "Регулярные выражения", создана пользователем Q_BASIC, 15 апр 2015.

Модераторы: xpert13
  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    384
    Симпатии:
    241
    Здравствуйте! :)

    Есть такое:
    PHP:
    $text = <<<HTML
    <div class="edit">
        [block]BLOCK #1[/block]
    </div>
    HTML;

    preg_match_all("#\[block\](.*)\[\/block\]#su"$text$out);

    print_r($out);
    Всё работает хорошо. В $out получаем BLOCK #1.

    А если будет так (добавим еще один блок) :
    PHP:
    $text = <<<HTML
    <div class="edit">
        [block]BLOCK #1[/block]
           <div></div>
        <div>[block]BLOCK #2[/block]
        </div>
    </div>
    HTML;

    preg_match_all("#\[block\](.*)\[\/block\]#su"$text$out);

    print_r($out);
    То в $out будет это (начинается с первого блока и кончается вторым) :
    Код:
    BLOCK #1[/block]
           <div></div>
        <div>[block]BLOCK #2
    Как сделать чтобы получался массив с отдельными вхождениями?
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    Это называется жадность квантификаторов
    https://php.net/manual/ru/regexp.reference.repetition.php
    Решается изменением шабона поиска путём добавления знака вопроса
    #\[block\](.*?)\[\/block\]#su
    либо поставить модификатор U

    #\[block\](.*?)\[\/block\]#suU
     
    Q_BASIC нравится это.