Найти и вырезать целиком произвольный <div>, помогите усмирить "жадность"

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

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Gaudi

    Gaudi

    Регистр.:
    11 янв 2007
    Сообщения:
    406
    Симпатии:
    376
    Добрый день,
    Вопрос конечно может быть и нубский, но к сожалению, сам не могу разобраться ((
    Помогите составить регулярку, нужно найти и заменить/вырезать целиком весь блок <div>*</div>, который содержащий определённый текст (в примере TXT)
    Код:
    <div>
    много строк
    </div>
    
    <div>
    много строк
    произвольный текст TXT
    много строк
    </div>
    
    если блок состоит из <div>произвольный текст TXT</div>, то найти не проблема, а вот если до искомого текста строк много, то захватывает и первый div
     
    Последнее редактирование: 3 май 2015
  2. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    215
    Симпатии:
    280
    В конструкции .*? нужно проверять что не вышли за границы блока примерно так
    Код:
    <div>(?:(?!</div>).)*?произвольный текст TXT.*?</div>
    
     
    xpert13, Gaudi и latteo нравится это.
  3. Gaudi

    Gaudi

    Регистр.:
    11 янв 2007
    Сообщения:
    406
    Симпатии:
    376
  4. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    215
    Симпатии:
    280
    Там для выражения заданы модификаторы /g /i, но нет модификатора /s, а без него метасимвол точка соответствует
    всем символам, кроме символа новой строки.

    Можно также настроить модификаторы прямо в регулярном выражении
    Код:
    (?is)<div>(?:(?!<\/div>).)*?TXT.*?<\/div>
    
     
    Последнее редактирование: 4 май 2015
    xpert13 нравится это.
  5. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    456
    Чтобы не зависеть от настроек модификаторов, в случаях когда нужно работать с многострочным текстом, вместо точки принято использовать конструкцию [\S\s]
     
Статус темы:
Закрыта.