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
Форумы портала PHP.SU :: Версия для печати :: Обработка пересекающихся тегов
Форумы портала PHP.SU » PHP » Программирование на PHP » Обработка пересекающихся тегов

Страниц (1): [1]
 

1. bartwell - 10 Марта, 2010 - 18:36:33 - перейти к сообщению
Есть задача: XML-строку вида
CODE (html):
скопировать код в буфер обмена
  1. <b>text1<u>text2<i>text3</b>text4</u>text5</i>text6

преобразовать в такой вид:
CODE (html):
скопировать код в буфер обмена
  1. <b>text1<u>text2<i>text3</i></u></b><i><u>text4</u>text5</i>text6


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

bartwell пишет:
мне кажется, что именно так работает человеческий мозг над такой задачей
Мой человеческий мозг работает так, как я написал)
12. JustUserR - 12 Марта, 2010 - 11:48:35 - перейти к сообщению
Champion пишет:
Значит берем тот, который удобнее для общего алгоритма. По-моему, так.
Это так но по-моему основная суть такова чтобы в данной ситуации лишним оказывался более вложенный тег - чтобы например в случае <b><i><b></i></b> лишним считался именно внутринней тег <b> чтобы не нарушалась вся остальная структура - а если начинать разбирать с более внутеннего то он отыщет в стеке последнее <b> и скушает его и при этом все нарушится

 

Powered by ExBB FM 1.0 RC1