Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Чт Дек 08 2005 03:59 Заголовок сообщения: Перекрывающиеся теги |
|
|
Пишу программу, которая из обычного html будет выдавать нечто иерархически структурированное (xml на самом деле).
Проблема в том, что хтмл может быть почти сколь угодно неправильно сформирован. Пропущенные закрывающие теги я уже добавлять умею. Лишние закрывающие удаляю (возможно в итоге получается не совсем то, что имел в виду автор такой разметки, но по крайней мере результат удовлетворяет меня). Проблема возникла с тегами, котоырм теоретически можно перекрываться: <i>что-то курсивом<b>жирным курсивом</i>просто жирным</b>. Единственное решение, которое я вижу - "сопрягать" (как движения в геометрии) второй тег с первым - <b> -> </i><b><i>
Такое вроде осуществимо, но хочется отличать это от ситуации, когда теги нормально вложены друг в друга.
Собственно задача на данный момент: имеется массив тегов (все, что тегами не является, заменено на <literal number="XXX" />, так что тоже считается тегом). Необходимо как-то в этом еще пока линейном массиве отловить перекрывающиеся теги. Есть регексп, который позволяет определить, относится ли данный тег к таким, которые вообще могут перекрываться. Теоретически все это делается на том этапе, когда элементы уже начинают группироваться (то есть <i><div>текст</div></i> уже превратился в <i><div ссылка на содержимое /></i> к тому моменту, как мы наткнулись на </i>). Как именно следует смотреть вперед по списку в поисках перекрывающегося тега?
Целый день уже над этим бьюсь, пока ни к чему не пришел. _________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
_youri_
Зарегистрирован: 27.09.2005 Сообщения: 16
|
Добавлено: Пн Дек 12 2005 08:09 Заголовок сообщения: |
|
|
Просматриваешь массив тэгов и по пути создаешь список еще не закрытых тэгов... когда натыкаешься на закрывающий тэг смотришь, соответствует ли он последнему элементу списка... если да - удаляешь последний элемент списка... если нет - вставляешь нужные тэги в нужное место... |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Вт Дек 13 2005 03:34 Заголовок сообщения: |
|
|
И что будет делать такой алгоритм с последовательностью <i><b></i></b>? Загвоздка-то как раз с такими сочетаниями. _________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Чт Дек 15 2005 13:13 Заголовок сообщения: |
|
|
Используй интерфейсы типа IHTMLDocument2, IHTMLElement и другие. Наверное, самый оптимальный вариант. |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Чт Дек 15 2005 15:13 Заголовок сообщения: |
|
|
Это из какой оперы?
Вопрос не в том, как написать прогармму, а в том, как должен выглядеть алгоритм.
Для справки: пишу на perl. Регулярные выражения сильно упрощают жизнь.. _________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Чт Дек 15 2005 15:30 Заголовок сообщения: |
|
|
Если подумать, то из "<i>...<b>...</i>...</b>" тебе нужно сделать что-то вроде "<i>...</i><b><i>...</i>...</b>". Это касается только тегов форматирования текста. Надо только запомнить открывающие теги, закрывать их перед следующими открывающими и сразу же открывать снова (чтобы понять, что я написал, возможно, придется прочитать несколько раз). В остальных случаях (например, "<p>a<div>b</p>c</div>") придется проявлять сообразительность. На поверку оказывается, что такая запись идентична "<p>a<div>b</div></p>c". Т.е. если теги не относятся к форматированию (проверить не сложно - их не так уж и много), то тег закрывается перед любым другим закрывающим тегом. При этом хорошо запомнить, что за тег мы закрыли и удалить его закрывающий тег, расположенный позже (если есть).
Только не забывай, что разные браузеры интерпретируют теги по-разному. Никогда не знаешь, как то или иное должно отображаться на самом деле. |
|
Вернуться к началу |
|
|
|