Как работают HTML-парсеры? - PullRequest
       1

Как работают HTML-парсеры?

8 голосов
/ 18 февраля 2011

Я видел юмористические темы и читал предупреждения, и я знаю, что вы не анализируете HTML с помощью регулярного выражения .Не волнуйтесь ... Я не планирую пробовать это .

НО ... что заставляет меня задаться вопросом: как кодируются HTML-парсеры (включая встроенные функцииязыков программирования, таких как парсеры DOM и PHP strip_tags)?Какой механизм они используют для анализа (иногда искаженной) разметки?

Я нашел источник из один, закодированный в JavaScript , и он фактически использует регулярное выражение для выполненияработа:

// Regular Expressions for parsing tags and attributes
var startTag = /^<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
    endTag = /^<\/(\w+)[^>]*>/,
    attr = /(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;  

Они все это делают?Есть ли обычный, стандартный способ кодирования HTML-парсера?

1 Ответ

3 голосов
/ 18 февраля 2011

Я не знаю, что этот стиль - «нормальный» способ делать вещи.Это лучше, чем большинство из тех, что я видел, но все же слишком близко к тому, что я называю «наивным» подходом в этом ответе .С одной стороны, это не учитывает комментарии HTML, мешающие вещам.Есть также юридические, но в некотором роде вопросы, с которыми он не связан.Но это HTML-комментарии, в которых большинство таких подходов рушатся.

Более естественный способ - использовать лексер для отделения токенов, как показано в примере в скрипте этого ответа , а затем собрать их осмысленно,Лексер мог бы достаточно легко узнать о комментариях HTML.

Вы могли бы подойти к этому с полной грамматикой, такой как приведенная здесь для анализаRFC 5322 почтовый адрес.Именно такой подход я использую во втором, «волшебном» решении в этом ответе .Но даже это всего лишь полная грамматика для правильно сформированного HTML, и меня интересуют только несколько разного рода тегов.Те, которые я определяю полностью, но я не определяю допустимые поля для тегов, которые меня не касаются.

...