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

Не зачем, хотя если не будет понятно, тогда приведу его. Единственная оговорка, это будем считать в данном случае html-код валидный на 100%.

Как работает - будем помещать в массив (push) открывающий тег каждой ветви дерева, и извлекая его из стека (pop), если следующий тег закрывающий и его имя равно тегу в вершине стека (ради производительности работаем с последним элементом массива). То есть получается имитация стека LIFO - последним пришел, первым вышел.

Ну и немного на примере вашего кода, как итерации цикла и действия, которые будут осуществляться в них:

1) Первый тег открывающий - заносим в стек
2) опять открывающий тег - заносим в стек
3) тег закрывающий, его имя равно тегу в вершине стека - извлекаем из стека, в стеке остался первый открывающий тег
4) открывающий тег - заносим в стек
5) открывающий тег - заносим в стек
6) открывающий тег - заносим в стек
7) тег закрывающий, его имя равно тегу в вершине стека - извлекаем из стека, в стеке остались открывающие теги (root, div1, div2, div4)

и т.д. То есть для дерева из тегов div все просто. Но если дерево содержит еще и теги, которые не имеют закрывающих, то надо еще иметь описание правил, то есть нужно еще иметь набор имен таких тегов, и не заносить их в стек.

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