Показать сообщение отдельно
  #72 (permalink)  
Старый 07.01.2016, 14:20
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Яростный Меч
Чтобы это добавить, надо сделать предварительный обход текста с выяснением, какие по счету встретившиеся открывающие теги проигнорировать при замене.
Смотря какой тег с ошибкой, совсем не обязательно потребуется что-то выяснять. Еще раз - html код, это всегда сначала открывающий тег (о не парных тегах пока молчим), именно он и только он помещается в стек. Закрывающий тег не помещается в стек, он не нужен там, этот тег для контроля.
В случае вашего невалидного кода b -> u -> /b -> /u:

1) открывающий тег b в стек, далее может идти либо закрывающий тег b, любо возможный в таком наборе иной открывающий тег
2) открывающий тег u в стек, далее может идти либо закрывающий тег u, любо возможный в таком наборе иной иной открывающий тег
3) закрывающий тег b, сравниваем его с вершиной стека, а в ней u - ошибка, удаляем из вершины стека u, текст обрамляющий этим невалидным набором на вывод как есть
4) закрывающий тег u, сравниваем его с вершиной стека, а в ней b - ошибка, удаляем из вершины стека b, текст обрамляющий этим невалидным набором на вывод как есть

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

Последний раз редактировалось laimas, 07.01.2016 в 14:25.
Ответить с цитированием