Я в основном согласен с ответом Sky Sanders. кроме:
Вы могли бы ожидать, что простой синтаксический анализатор выведет предыдущие намерения.
Вы можете написать синтаксический анализатор, который обеспечивает описанную функциональность, без необходимости выводить какие-либо намерения, работая просто детерминистически. Можно легко (да, более или менее легко :)) написать алгоритм, который делает эту работу. Идея была бы:
Добавление закрывающих тегов
В конце концов, это можно сделать с помощью HTML Tidy, и каждый браузер / парсер делает это неявно (я не говорю о допустимом XHTML здесь):
<div>some <span><em>text</span> here</div>
получает
<div>some <span><em>text</em></span> here</div>
Добавление открывающих тегов
Теперь мы можем создать алгоритм, который анализирует следующее, начиная с конца строки и выполняя обратный поиск:
<div>some <span>text</em></span> here</div>
для получения следующего, потому что он видит, что тег em
встроен в тег span
.
<div>some <span><em>text</em></span> here</div>
Объединение этих двух
Теперь мы должны написать алгоритм, который добавляет и отсутствующие закрывающие и открывающие теги. Теперь давайте возьмем этот HTML-фрагмент:
<div>some <span>text</em> here</div>
Сначала примените метод «добавить все отсутствующие закрывающие теги»:
<div>some <span>text</em> here</span></div>
Алгоритм здесь предполагает, что каждый закрывающий и открывающий тег, следующий за <span>
, внедряется в span
. Он останавливается только в том случае, если видит закрывающий тег для некоторого открывающего тега, который был до <span>
. В данном случае это </div>
, который имел действительный открывающий тег <div>
ранее. Затем примените ту же семантику при обратном поиске, как описано ранее:
<div>some <span><em>text</em> here</span></div>
и вуаля.
Имеет ли это смысл?
По моему мнению: Нет. Это технически возможно, но не стоит усилий. Вы должны будете реализовать свой собственный анализатор вместе с этими псевдоинтеллектуальными методами, описанными выше. Кроме того, это применило бы к html семантику, которой нет в любом случае: каждый браузер / парсер просто игнорирует изолированные закрывающие теги, так почему вы хотите обратить на них внимание?
Если я еще не смог убедить вас, рассмотрите семантику html:
some <b>text</b> here
читается как: «напечатать« некоторые ». Начать рендеринг жирным шрифтом. Напечатать« текст ». Остановить рендеринг жирным шрифтом. Напечатать« здесь ».»
В то время как:
some text</b> here
читается как: «напечатать« некоторый текст ». Прекратить выделение жирным шрифтом». «Что? Я даже не начал выдавать что-нибудь смелое !? Я просто проигнорирую это ...»:)