Выделение требуемых тегов
Используя регулярное выражение, полученное на предыдущем шаге, мы можем выделить из текста сразу несколько типов тегов, используя конструкцию «альтернативная последовательность при отсутствии совпадения слева». В описании используем термин «альтернативная последовательность».
Добавим выделение из текста всего содержимого абзацев и пунктов списка:
- подстроку 'p'
- Добавим альтернативную последовательность
- подстроку 'li'
- Завершим захватывать совпадения
- Произведём проверку на удачное совпадение справа набора символов '\s>'
- Захватим 0 или более символов, не совпадающих с набором символов '>'
- Захватим подстроку '>'
- Начнём захватывать символы в последовательность
- Начнём захватывать символы в несохраняющую последовательность
- Начнём проверку на отсутствие удачного совпадения справа последовательности из
- '</'
- совпадение найденное на шагах 2-3 (ссылка на последовательность 1)
- '>'
- Завершим проверку
- Захватим любой символ
- Завершим захватывать совпадения
- Захватим последовательность 0 или более раз
- Завершим захватывать совпадения
- Захватим подстроку '</'
- Захватим совпадение найденное на шагах 2-3 (ссылка на последовательность 1)
- Захватим подстроку '>'
- <
- (
- p
- |
- li
- )
- (?=[\s>])
- [^>]*
- >
- (
- (?:
- (?!
- </
- \1
- >
- )
- .
- )
- *
- )
- </
- \1
- >
Новое регулярное выражение:
<(p|li)(?=[\s>])[^>\w]*>((?:(?!</\1>).)*))</\1>
Теперь в тексте будут выделены только теги p и li и всё их содержимое.
Содержание раздела
- (?!
- (?:
Пункты 7 и 8 были добавлены для того, чтобы выражение не захватывало теги, начало которых совпадает с выделяемыми тегами. Например, чтобы при поиске тега <p> не были захвачены теги <param>.
Переводим её в операторы регулярного выражения:
- Начнём проверку на отсутствие удачного совпадения справа последовательности из
- Начнём захватывать символы в несохраняющую последовательность