HTML / XML делится на разметку и контент.
Regex полезен только для анализа лексических тегов.
Я думаю, вы могли бы вывести содержание.
Это был бы хороший выбор для парсера SAX.
Теги и контент могут быть доставлены пользователю
определенная функция, где вложенность / закрытие элементов
можно отслеживать.
Что касается простого анализа тегов, это можно сделать с помощью
регулярное выражение и используется для удаления тегов из документа.
За годы испытаний я нашел секрет к
способ, которым браузеры анализируют теги, как хорошо, так и плохо сформированные
Нормальные элементы анализируются с помощью этой формы:
Ядро этих тегов использует это регулярное выражение
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
Вы заметите это [^>]?
как одно из чередований.
Это будет соответствовать несбалансированным цитатам из плохо сформированных тегов.
Это также самый корень всего зла регулярных выражений.
То, как оно используется, вызовет удар, чтобы удовлетворить его жадность, которая должна соответствовать
количественный контейнер.
При пассивном использовании проблем не возникает.
Но, если вы заставите что-либо сопоставить, добавив к нему
требуемая пара атрибут / значение и не обеспечивает адекватную защиту
от отслеживания, это неуправляемый кошмар.
Это общая форма для простых старых тегов.
Обратите внимание на [\w:]
, представляющий имя тега?
В действительности, допустимые символы, представляющие имя тега
невероятный список символов Юникода.
<
(?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
>
Продолжая, мы также видим, что вы просто не можете найти определенный тег
без разбора ALL тегов.
Я имею в виду, что вы могли бы, но это должно было бы использовать комбинацию
глаголы типа (* SKIP) (* FAIL), но все же все теги должны быть проанализированы.
Причина в том, что синтаксис тегов может быть скрыт внутри других тегов и т. Д.
Итак, для пассивного анализа всех тегов необходимо регулярное выражение, подобное приведенному ниже.
Этот конкретный соответствует невидимое содержимое .
По мере того, как новый HTML или xml или любая другая разработка разрабатывают новые конструкции, просто добавьте его как
одно из чередований.
Примечание веб-страницы - я никогда не видел веб-страницу (или xhtml / xml), что это
были проблемы с. Если найдешь, дай мне знать.
Замечание по производительности - это быстро. Это самый быстрый анализатор тегов, который я видел
(может быть быстрее, кто знает).
У меня есть несколько конкретных версий. Это также отлично, как скребок
(если вы практический тип).
Полное необработанное регулярное выражение
<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>
Форматированный вид
<
(?:
(?:
(?:
# Invisible content; end tag req'd
( # (1 start)
script
| style
| object
| embed
| applet
| noframes
| noscript
| noembed
) # (1 end)
(?:
\s+
(?>
" [\S\s]*? "
| ' [\S\s]*? '
| (?:
(?! /> )
[^>]
)?
)+
)?
\s* >
)
[\S\s]*? </ \1 \s*
(?= > )
)
| (?: /? [\w:]+ \s* /? )
| (?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
| \? [\S\s]*? \?
| (?:
!
(?:
(?: DOCTYPE [\S\s]*? )
| (?: \[CDATA\[ [\S\s]*? \]\] )
| (?: -- [\S\s]*? -- )
| (?: ATTLIST [\S\s]*? )
| (?: ENTITY [\S\s]*? )
| (?: ELEMENT [\S\s]*? )
)
)
)
>