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

dandandan

Мой дом здесь!
Регистрация
7 Авг 2008
Сообщения
1.036
Реакции
292
Ломаю голову 2ой день. Помогите "доломать". Есть текстовый файл с перечислениями.

Текст текст тест. Не должен попасть в выборку
{li} вариант 1 Блок 1
{li} вариант 2 Блок 1
{li} вариант 3 Блок 1

Текст текст тест. Не должен попасть в выборку
Текст текст тест. Не должен попасть в выборку
{li} вариант 6 Блок 2
{li} вариант 7 Блок 2

Текст текст тест. Не должен попасть в выборку
Текст текст тест. Не должен попасть в выборку

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

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

Другой вариант - выбираю одно перечисление и указываю, что их может быть больше одного
Тоже не работает.
 
Если я правильно понял условие, то достаточно /(^{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]);

Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Условие верное, но вот не работает, к сожалению.
В примере выше должно получиться 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 кодировке.

Вместо двойных слешей поставил одинарные, В результате
получаю:
DtaIP0nV.png



т.е. скрипт нашел первое вхождение и закончил концом текста...
 
Все работает. Нашел косяк. В начале текста были пробелы.
 
Назад
Сверху