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 :: Обработка пересекающихся тегов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
bartwell
Отправлено: 10 Марта, 2010 - 18:36:33
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Есть задача: 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


Т.е., нужно обработать строку таким образом, чтобы не было пересечений тегов. Как это сделать? Подскажите, пожалуйста, алгоритм.
 
 Top
Champion Супермодератор
Отправлено: 11 Марта, 2010 - 08:39:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Возьми стек. Точнее, сымитируй его. Открылся тэг - добавил в стек. Закрылся тэг - извлекаешь из стека открытые тэги, и закрываешь их, пока не дойдешь до пары того тэга, который тебя спровоцировал на закрывание.
 
 Top
bartwell
Отправлено: 11 Марта, 2010 - 11:06:48
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Champion, ну да, в эту же сторону и я копаю... Думал, мало ли, может что-то концептуальное есть Улыбка Спасибо за ответ.
 
 Top
JustUserR
Отправлено: 11 Марта, 2010 - 14:06:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




bartwell пишет:
Думал, мало ли, может что-то концептуальное есть
Вроде бы стек для этого и предназначен - как только встречается закрывающий тег вы должны проверить совпадает ли он с последним открывающим и если не совпадает то очевидно неверно закрытый тег


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
bartwell
Отправлено: 11 Марта, 2010 - 14:16:00
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Ну это да. И если бы нужно было просто проверить - никакой проблемы не было бы в принципе. А тут нужно еще и переставить местами, где надо закрыть и открыть заново, в общем, целая эпопея. Плюс все усложняется все тем, что таких тегов может быть до пяти и соответственно манипуляции с ними нужно проводить в определенной последовательности.
 
 Top
JustUserR
Отправлено: 11 Марта, 2010 - 14:19:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




bartwell пишет:
А тут нужно еще и переставить местами, где надо закрыть и открыть заново, в общем, целая эпопея
Хм в таком случае вы можете например организовать глубину поиска и если в течение данной глубины встретились теги которые взаимно можно поменять то меяете их местами - правда до этого надо пройтись и поверить не были ли все остальные парными (В таком случае тег просто ошибочный) и еще не забывать давать приоритете неизменения тегам (То есть не менять внутренний неверный тег с внешним отличющимся на много уровней поиска чтобы не ломать все остальные соответствия Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
bartwell
Отправлено: 11 Марта, 2010 - 14:30:06
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




JustUserR, ну да, над этим сейчас и работаю как раз Улыбка
 
 Top
Champion Супермодератор
Отправлено: 11 Марта, 2010 - 15:10:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




bartwell, а, да, про открыть заново я не подумал. Глубина не важна.
Тогда так:
Создаешь массив пар тэгов (открывающий - закрывающий)
Идешь по строке.
Нашел открывающий тэг, сунул его в стек.
Нашел закрывающий тэг, раскопал его пару в стеке, а то, что высовывал из стека пока раскапывал, суй в другой стек.
Вставил в строку закрывающий тэг и перегоняешь из второго стека в первый то, что туда сунул, попутно вставляя в строку эти отркывающие тэги.
 
 Top
JustUserR
Отправлено: 11 Марта, 2010 - 19:09:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Champion пишет:
Нашел закрывающий тэг, раскопал его пару в стеке, а то, что высовывал из стека пока раскапывал, суй в другой стек.
Это хорошо если все теги абсолютно разные тогда можно действительно перекапывать их сколько угодно - однако если теги одинаковые то такой предложенный механизм может указать ошибку не в том месте то есть закрыть тег не там где нужно


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
bartwell
Отправлено: 11 Марта, 2010 - 19:52:11
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Вообще, после всех длительных раздумий на эту тему, самым оптимальным вариантом для меня кажется такой: разобрать текст на куски с указанием его свойств и собрать обратно, уже правильно и оптимально. Во всяком случае, мне кажется, что именно так работает человеческий мозг над такой задачей Улыбка Хоть и согласен, что он далеко не всегда идеальный пример для подражания, но тем не менее, такой подход позволяет сразу видеть всю картину целиком. Да и понять его в будущем будет гораздо проще при необходимости.
 
 Top
Champion Супермодератор
Отправлено: 12 Марта, 2010 - 08:46:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




JustUserR, вложенные одинаковые тэги - штука конечно интересная. Ну вот допустим, попали у нас в стек 2 открывающихся тега <b>. Когда встретилась одна закрывающая пара, закрываем один (ближний), когда вторая - второй. Если вдруг остается один бесхозный открывающий тэг, то как ты решишь, какой из двух бесхозный? Любой - правильно? Значит берем тот, который удобнее для общего алгоритма. По-моему, так.

bartwell пишет:
мне кажется, что именно так работает человеческий мозг над такой задачей
Мой человеческий мозг работает так, как я написал)
 
 Top
JustUserR
Отправлено: 12 Марта, 2010 - 11:48:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




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


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB