Я не думаю, что кто-то еще отправит ответ, поэтому для записи я записываю здесь то, что я узнал из комментариев и здравого совета sideshowbarker
Что говорит новейший стандарт HTML5 о немаркированном тексте и как он
нужно лечить?
Текст без тегов вводится в DoM как текстовый узел. Текстовый узел вставляется как дочерний узел элемента, в котором он появляется. Например, в этом фрагменте:
<body>
<h2><b>Hello World</b></h2>
<p>First</p>
Second
<p>Third</p>
</body>
... «Второй» - это часть текстового узла (nodeType = 3), который является дочерним узлом элемента body.
Фактически существует 4 дочерних текстовых узла (значения узлов каждого показаны в списке ниже).
"CR-LF "
после открытия body tag.
"CR-LF "
после элемента <h2><b>Hello World</b></h2>
"CR-LF Second-CR-LF "
после элемента <p>First</p>
"CR-LF "
после элемента <p>Third</p>
Вероятно, большинство "uglifiers" удалит CR_LF и пробелы из текстового узла, что в большинстве случаев может удалить их вообще.
Как современные парсеры HTML обрабатывают нетегированный текст?
Как указано выше, но по крайней мере с этими классификаторами:
- текст без тегов (будь то форматирование, алфавитно-цифровой или оба) между тегами
<html>
, но вне тегов <body>
, будет перемещен внутри элемента <body>
.
- Если теги
<body>
отсутствуют, парсер их вставит.
Например, используя PHPDocument (встроенный синтаксический анализатор PHP) этот вход ..
<html>
text before body
<body>
<h2><b>Hello World</b></h2>
<p>First</p>
Second
<p>Third</p>
fourth
<p>Third</p>
<!-- comment -->
</body>
text after body
</html>
.. создал этот DoM (нетегированный текст перемещен в элемент <body>
).
<html><body>
<p>
text before body
</p>
<h2><b>Hello World</b></h2>
<p>First</p>
Second
<p>Third</p>
fourth
<p>Third</p>
<!-- comment -->
text after body
</body></html>
и этот вход ..
<html>
<h2><b>Hello World</b></h2>
<p>First</p>
Second
<p>Third</p>
fourth
<p>Third</p>
<!-- comment -->
</html>
.. создал этот DoM (<body>
теги, вставленные парсером)
<html>
<body>
<h2><b>Hello World</b></h2>
<p>First</p>
Second
<p>Third</p>
fourth
<p>Third</p>
<!-- comment -->
</body>
</html>
Может ли рассматриваемая проблема в SO52159323 быть решена с помощью
Класс HTMLParser (на любом языке). Я имею в виду, запустив текст
мимо парсера и ожидая, что парсер идентифицирует нетегированный текст
а его местонахождение?
Да. Смотрите фрагмент кода в моем ответе по адресу Добавление HTML-тега в строку в PHP . Конечно, синтаксический анализатор создает DoM, позволяющий найти узел-кандидат и выполнить необходимую обработку.