Т.е., нужно обработать строку таким образом, чтобы не было пересечений тегов. Как это сделать? Подскажите, пожалуйста, алгоритм.
Champion
Отправлено: 11 Марта, 2010 - 08:39:54
Эксперт
Покинул форум
Сообщений всего: 3426
Дата рег-ции: Авг. 2008 Откуда: Москва
Возьми стек. Точнее, сымитируй его. Открылся тэг - добавил в стек. Закрылся тэг - извлекаешь из стека открытые тэги, и закрываешь их, пока не дойдешь до пары того тэга, который тебя спровоцировал на закрывание.
bartwell
Отправлено: 11 Марта, 2010 - 11:06:48
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010
Champion, ну да, в эту же сторону и я копаю... Думал, мало ли, может что-то концептуальное есть Спасибо за ответ.
JustUserR
Отправлено: 11 Марта, 2010 - 14:06:34
Эксперт
Покинул форум
Сообщений всего: 5854
Дата рег-ции: Июнь 2009
bartwell пишет:
Думал, мало ли, может что-то концептуальное есть
Вроде бы стек для этого и предназначен - как только встречается закрывающий тег вы должны проверить совпадает ли он с последним открывающим и если не совпадает то очевидно неверно закрытый тег
-----
bartwell
Отправлено: 11 Марта, 2010 - 14:16:00
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010
Ну это да. И если бы нужно было просто проверить - никакой проблемы не было бы в принципе. А тут нужно еще и переставить местами, где надо закрыть и открыть заново, в общем, целая эпопея. Плюс все усложняется все тем, что таких тегов может быть до пяти и соответственно манипуляции с ними нужно проводить в определенной последовательности.
JustUserR
Отправлено: 11 Марта, 2010 - 14:19:57
Эксперт
Покинул форум
Сообщений всего: 5854
Дата рег-ции: Июнь 2009
bartwell пишет:
А тут нужно еще и переставить местами, где надо закрыть и открыть заново, в общем, целая эпопея
Хм в таком случае вы можете например организовать глубину поиска и если в течение данной глубины встретились теги которые взаимно можно поменять то меяете их местами - правда до этого надо пройтись и поверить не были ли все остальные парными (В таком случае тег просто ошибочный) и еще не забывать давать приоритете неизменения тегам (То есть не менять внутренний неверный тег с внешним отличющимся на много уровней поиска чтобы не ломать все остальные соответствия
-----
bartwell
Отправлено: 11 Марта, 2010 - 14:30:06
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010
JustUserR, ну да, над этим сейчас и работаю как раз
Champion
Отправлено: 11 Марта, 2010 - 15:10:46
Эксперт
Покинул форум
Сообщений всего: 3426
Дата рег-ции: Авг. 2008 Откуда: Москва
bartwell, а, да, про открыть заново я не подумал. Глубина не важна.
Тогда так:
Создаешь массив пар тэгов (открывающий - закрывающий)
Идешь по строке.
Нашел открывающий тэг, сунул его в стек.
Нашел закрывающий тэг, раскопал его пару в стеке, а то, что высовывал из стека пока раскапывал, суй в другой стек.
Вставил в строку закрывающий тэг и перегоняешь из второго стека в первый то, что туда сунул, попутно вставляя в строку эти отркывающие тэги.
JustUserR
Отправлено: 11 Марта, 2010 - 19:09:28
Эксперт
Покинул форум
Сообщений всего: 5854
Дата рег-ции: Июнь 2009
Champion пишет:
Нашел закрывающий тэг, раскопал его пару в стеке, а то, что высовывал из стека пока раскапывал, суй в другой стек.
Это хорошо если все теги абсолютно разные тогда можно действительно перекапывать их сколько угодно - однако если теги одинаковые то такой предложенный механизм может указать ошибку не в том месте то есть закрыть тег не там где нужно
-----
bartwell
Отправлено: 11 Марта, 2010 - 19:52:11
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010
Вообще, после всех длительных раздумий на эту тему, самым оптимальным вариантом для меня кажется такой: разобрать текст на куски с указанием его свойств и собрать обратно, уже правильно и оптимально. Во всяком случае, мне кажется, что именно так работает человеческий мозг над такой задачей Хоть и согласен, что он далеко не всегда идеальный пример для подражания, но тем не менее, такой подход позволяет сразу видеть всю картину целиком. Да и понять его в будущем будет гораздо проще при необходимости.
Champion
Отправлено: 12 Марта, 2010 - 08:46:02
Эксперт
Покинул форум
Сообщений всего: 3426
Дата рег-ции: Авг. 2008 Откуда: Москва
JustUserR, вложенные одинаковые тэги - штука конечно интересная. Ну вот допустим, попали у нас в стек 2 открывающихся тега <b>. Когда встретилась одна закрывающая пара, закрываем один (ближний), когда вторая - второй. Если вдруг остается один бесхозный открывающий тэг, то как ты решишь, какой из двух бесхозный? Любой - правильно? Значит берем тот, который удобнее для общего алгоритма. По-моему, так.
bartwell пишет:
мне кажется, что именно так работает человеческий мозг над такой задачей
Мой человеческий мозг работает так, как я написал)
JustUserR
Отправлено: 12 Марта, 2010 - 11:48:35
Эксперт
Покинул форум
Сообщений всего: 5854
Дата рег-ции: Июнь 2009
Champion пишет:
Значит берем тот, который удобнее для общего алгоритма. По-моему, так.
Это так но по-моему основная суть такова чтобы в данной ситуации лишним оказывался более вложенный тег - чтобы например в случае <b><i><b></i></b> лишним считался именно внутринней тег <b> чтобы не нарушалась вся остальная структура - а если начинать разбирать с более внутеннего то он отыщет в стеке последнее <b> и скушает его и при этом все нарушится
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.