Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Обработка пересекающихся тегов
Т.е., нужно обработать строку таким образом, чтобы не было пересечений тегов. Как это сделать? Подскажите, пожалуйста, алгоритм.
Champion
Отправлено: 11 Марта, 2010 - 08:39:54
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Возьми стек. Точнее, сымитируй его. Открылся тэг - добавил в стек. Закрылся тэг - извлекаешь из стека открытые тэги, и закрываешь их, пока не дойдешь до пары того тэга, который тебя спровоцировал на закрывание.
bartwell
Отправлено: 11 Марта, 2010 - 11:06:48
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010
Помог: 0 раз(а)
Champion, ну да, в эту же сторону и я копаю... Думал, мало ли, может что-то концептуальное есть Спасибо за ответ.
JustUserR
Отправлено: 11 Марта, 2010 - 14:06:34
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
bartwell пишет:
Думал, мало ли, может что-то концептуальное есть
Вроде бы стек для этого и предназначен - как только встречается закрывающий тег вы должны проверить совпадает ли он с последним открывающим и если не совпадает то очевидно неверно закрытый тег
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
bartwell
Отправлено: 11 Марта, 2010 - 14:16:00
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010
Помог: 0 раз(а)
Ну это да. И если бы нужно было просто проверить - никакой проблемы не было бы в принципе. А тут нужно еще и переставить местами, где надо закрыть и открыть заново, в общем, целая эпопея. Плюс все усложняется все тем, что таких тегов может быть до пяти и соответственно манипуляции с ними нужно проводить в определенной последовательности.
JustUserR
Отправлено: 11 Марта, 2010 - 14:19:57
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
bartwell пишет:
А тут нужно еще и переставить местами, где надо закрыть и открыть заново, в общем, целая эпопея
Хм в таком случае вы можете например организовать глубину поиска и если в течение данной глубины встретились теги которые взаимно можно поменять то меяете их местами - правда до этого надо пройтись и поверить не были ли все остальные парными (В таком случае тег просто ошибочный) и еще не забывать давать приоритете неизменения тегам (То есть не менять внутренний неверный тег с внешним отличющимся на много уровней поиска чтобы не ломать все остальные соответствия
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
bartwell
Отправлено: 11 Марта, 2010 - 14:30:06
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010
Помог: 0 раз(а)
JustUserR, ну да, над этим сейчас и работаю как раз
Champion
Отправлено: 11 Марта, 2010 - 15:10:46
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
bartwell, а, да, про открыть заново я не подумал. Глубина не важна.
Тогда так:
Создаешь массив пар тэгов (открывающий - закрывающий)
Идешь по строке.
Нашел открывающий тэг, сунул его в стек.
Нашел закрывающий тэг, раскопал его пару в стеке, а то, что высовывал из стека пока раскапывал, суй в другой стек.
Вставил в строку закрывающий тэг и перегоняешь из второго стека в первый то, что туда сунул, попутно вставляя в строку эти отркывающие тэги.
JustUserR
Отправлено: 11 Марта, 2010 - 19:09:28
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Champion пишет:
Нашел закрывающий тэг, раскопал его пару в стеке, а то, что высовывал из стека пока раскапывал, суй в другой стек.
Это хорошо если все теги абсолютно разные тогда можно действительно перекапывать их сколько угодно - однако если теги одинаковые то такой предложенный механизм может указать ошибку не в том месте то есть закрыть тег не там где нужно
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
bartwell
Отправлено: 11 Марта, 2010 - 19:52:11
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010
Помог: 0 раз(а)
Вообще, после всех длительных раздумий на эту тему, самым оптимальным вариантом для меня кажется такой: разобрать текст на куски с указанием его свойств и собрать обратно, уже правильно и оптимально. Во всяком случае, мне кажется, что именно так работает человеческий мозг над такой задачей Хоть и согласен, что он далеко не всегда идеальный пример для подражания, но тем не менее, такой подход позволяет сразу видеть всю картину целиком. Да и понять его в будущем будет гораздо проще при необходимости.
Champion
Отправлено: 12 Марта, 2010 - 08:46:02
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
JustUserR, вложенные одинаковые тэги - штука конечно интересная. Ну вот допустим, попали у нас в стек 2 открывающихся тега <b>. Когда встретилась одна закрывающая пара, закрываем один (ближний), когда вторая - второй. Если вдруг остается один бесхозный открывающий тэг, то как ты решишь, какой из двух бесхозный? Любой - правильно? Значит берем тот, который удобнее для общего алгоритма. По-моему, так.
bartwell пишет:
мне кажется, что именно так работает человеческий мозг над такой задачей
Мой человеческий мозг работает так, как я написал)
JustUserR
Отправлено: 12 Марта, 2010 - 11:48:35
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Champion пишет:
Значит берем тот, который удобнее для общего алгоритма. По-моему, так.
Это так но по-моему основная суть такова чтобы в данной ситуации лишним оказывался более вложенный тег - чтобы например в случае <b><i><b></i></b> лишним считался именно внутринней тег <b> чтобы не нарушалась вся остальная структура - а если начинать разбирать с более внутеннего то он отыщет в стеке последнее <b> и скушает его и при этом все нарушится
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.