Как работают диаграммы HTML, если они не используют Regexp?

StackOverflow https://stackoverflow.com/questions/2400623

Вопрос

Я вижу вопросы каждый день, спрашивая, как проанализировать или извлекать что -то из какой -то строки HTML, и первый ответ/комментарий всегда: «Не используйте Regex для разбора HTML, чтобы вы не почувствовали гнев!» (Эта последняя часть иногда опускается).

Это довольно сбивает с толку, я всегда думал, что в целом лучший способ проанализировать любую сложную строку - использовать регулярное выражение. Так как же работает диапазон HTML? Разве он не использует регулярные выражения для анализа.

Одним из конкретных аргументов для использования регулярного выражения является то, что не всегда существует альтернатива анализа (например, JavaScript, где Domdocument не является универсально доступным вариантом). Например, jQuery, кажется, отлично справляется с использованием корпорации для преобразования строки HTML в узлы DOM.

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

Это было полезно?

Решение

Обычно с помощью токенизатора. Проект Спецификация HTML5 имеет обширный алгоритм Для обработки "Real World html".

Другие советы

Так как же работает диапазон HTML? Разве он не использует регулярные выражения для разбора?

Ну нет.

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

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

Классический простой язык, который не является обычным, правильно соответствует скобкам. Как вы могли бы попробовать, вы никогда не сможете создать регулярное выражение (или конечный автомат), которое всегда будет работать. Вам нужна память, чтобы отслеживать глубину гнездования.

Машина состояния со стеком для памяти является следующей силой вычислительной модели. Это называется автоматическим автоматом, и он распознает языки, генерируемые грамматиками без контекста. Здесь мы можем распознать правильно сопоставленные скобки-действительно, стек-идеальная модель памяти для нее.

Ну, это достаточно хорошо для HTML? К сожалению нет. Возможно, для супер-Duper, тщательно проверенного XML, на самом деле, в котором все теги всегда выстраиваются идеально. В реальном мире HTML вы можете легко найти фрагменты, как <b><i>wow!</b></i>. Анкет Это, очевидно, не гнездится, поэтому для правильного анализа его, стек просто недостаточно мощный.

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

Подводя итог все здесь, в одном предложении: для проанализирования общего HTML вам нужен реальный язык программирования, а не регулярное выражение.

HTML анализируется так же, как и другие языки проанализированы: лексинг и анализ. Шаг Lexing разбивает поток отдельных символов на значимые токены. Шаг разбора собирает токены, используя состояния и память, в логически когерентный документ, который можно действовать.

Регулярные выражения - это только одна форма анализатора. HTML-анализатор HTML с честным и хорошим рекурсивный спуск, прогноз и несколько других методов для правильной интерпретации текста. Если вы действительно хотите попасть в это, вы можете проверить Lex & Yacc и аналогичные инструменты.

Запрет на использование режимов для HTML -анализа, вероятно, следует записано более правильно, как: «Не используйте Наив Регулярные выражения для разбора HTML ... " (чтобы вы не почувствовали гнев) «... и относиться к результатам с осторожностью». Для определенных конкретных целей, регулярность вполне может быть вполне адекватной, но вы должны быть очень осторожны, чтобы знать о ограничениях вашей корпорации и столь же осторожно Пользовательский ввод, действительно очень осторожен).

Диаграмма HTML - это преобразование линейного текста в структуру дерева. Регулярные выражения обычно не могут обрабатывать структуры деревьев. Регулярное выражение, которое вам нужно в каждой точке, чтобы постоянно менять следующий токен. Вы можете использовать регулярные выражения в анализаторе, но вам понадобится целый ряд регулярных выражений для каждого возможного состояния анализа.

Если вы хотите получить 100% решение: вам нужно написать свой собственный собственный код, который итерация проходит через HTML-символ за характером, и вам нужно иметь огромное количество логики, чтобы определить, стоит ли вам остановить текущий узел и начать следующий.

Причина в том, что это действительный HTML:

<ul>
<li>One
<li>Two
<li>Three
</ul>

Но так: так:

<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>

Если у вас все в порядке с «90% решением»: тогда использование анализатора XML для загрузки документа - это нормально. Или использование REGEX (хотя XML проще, если вы, тогда мастер контента).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top