[PHP] Регулярку для отлова списков

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

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

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    996
    Симпатии:
    268
    Ломаю голову 2ой день. Помогите "доломать". Есть текстовый файл с перечислениями.

    Нужно регуляркой получить 2 блока (выделены жирно). В дальнейшем найденные блоки будут обернуты в тег <UL> (для этого и нужно найти).
    Блоков может быть больше, количество перечислений произвольное. Каждое перечисление начинается с новой строки с открывающейся фигурной скобки {li} далее идет произвольный текст на один абзац.

    В итоге добрался до такого варианта, но бесполезно:
    (^\{olli\}[^\^]*?) - поиск строки из одного перечисления.
    (?=^[^{][^o][^l][^l][^i][^}]) - Позитивный просмотр вперёд

    Другой вариант - выбираю одно перечисление и указываю, что их может быть больше одного
    Тоже не работает.
     
  2. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    215
    Симпатии:
    280
    Если я правильно понял условие, то достаточно /(^{li}.+\r?\n?)+/m
    PHP:
    $re "~(^{li}.+\\r?\\n?)+~m";
    $str "Текст текст тест. Не должен попасть в выборку\n{li} вариант 1 Блок 1\n{li} вариант 2 Блок 1\n{li} вариант 3 Блок 1\nТекст текст тест. Не должен попасть в выборку\nТекст текст тест. Не должен попасть в выборку\n{li} вариант 6 Блок 2\n{li} вариант 7 Блок 2\nТекст текст тест. Не должен попасть в выборку\nТекст текст тест. Не должен попасть в выборку";
     
    preg_match_all($re$str$matches);

    var_dump($matches[0]);
    http://sandbox.onlinephpfunctions.com/code/646b0fc898fdee8c19026cd358885b2c3088d96f
     
    Последнее редактирование: 19 окт 2015
    dandandan нравится это.
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    996
    Симпатии:
    268
    Условие верное, но вот не работает, к сожалению.
    В примере выше должно получиться 2 элемента массива.

    1)
    {li} вариант 1 Блок 1
    {li} вариант 2 Блок 1
    {li} вариант 3 Блок 1


    2)
    {li} вариант 6 Блок 2
    {li} вариант 7 Блок 2


    Выдает пустой массив:
    PHP:
    Array
    (
        [
    0] => Array
            (
            )

        [
    1] => Array
            (
            )

    )
    добавил модификатор u, т.к. текст в УТФ8 кодировке.

    Вместо двойных слешей поставил одинарные, В результате
    получаю:
    [​IMG]


    т.е. скрипт нашел первое вхождение и закончил концом текста...
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    https://3v4l.org/7nHLF - во всех версиях php всё как и заказано!
     
    dandandan нравится это.
  5. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    996
    Симпатии:
    268
    Все работает. Нашел косяк. В начале текста были пробелы.