[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсер для обработки тагов
Deadangel
Всем привет,

прошу Вас помочь в одной деликатной ситуации. Ситуация такая:

есть некоторый текст из N символов. В этом тексте содержатся разные таги (<table>, <tr>, <td>, <img>, <a>). Нужно этот текст разделить на несколько равных частей, т.е сделать постраничный вывод для этого текста. Возникают такие ситуации, когда при разделении текста половина тага находится в одной части, другая половина находится в другой. Чтобы этого избежать, нужно обрабатывать эти таги. Может быть кто-нибудь подскажет, есть ли готовые решения подобных парсеров или же может кто делал что-то подобное. Буду признателен за любую информацию.


Спасибо.




Спустя 21 час, 20 минут, 36 секунд (28.10.2007 - 15:52) kyryll написал(а):
Все теги, кроме <img> придется вырезать. Используй строковую функцию, ну к примеру, замены str_replace. Замени все найденные теги на пустую строку. Потом обрабатывай так, как тебе нужно и выводи в новые таблицы. Но здесь есть минус (вообще в этой системе) - потеряешь красивое форматирование текста, если оно конечно было.

Спустя 5 часов, 19 минут, 44 секунды (28.10.2007 - 21:12) Deadangel написал(а):
как раз все форматирование и нужно сохранить ....

Спустя 14 часов, 3 минуты, 51 секунда (29.10.2007 - 11:16) vasa_c написал(а):
Код валидный? Все теги грамотно закрыты в нужных местах?

Спустя 16 минут, 47 секунд (29.10.2007 - 11:33) Deadangel написал(а):
Все закрывающиеся теги закрыты нормально, но есть и одиночные теги: <img>, <br>, <hr>. Самое палево - <img>. Когда в него попадает - все ломается. И это HTML, а не XHTML.

Спустя 3 часа, 27 минут, 26 секунд (29.10.2007 - 15:00) vasa_c написал(а):
Цитата
Самое палево - <img>

Разделив на две части ищите в начале второй шаблон [^<>]*> Нашли, значит это огрызок тега — перекиньте его в первую часть.

Ни и так же придется искать от конца первой части все открывающие теги и соответствующие им закрывающие во второй.

Спустя 8 часов, 56 минут, 2 секунды (29.10.2007 - 23:56) kyryll написал(а):
Цитата(vasa_c @ 29.10.2007, 12:00) [snapback]28677[/snapback]
Цитата
Самое палево - <img>

Разделив на две части ищите в начале второй шаблон [^<>]*> Нашли, значит это огрызок тега — перекиньте его в первую часть.

Ни и так же придется искать от конца первой части все открывающие теги и соответствующие им закрывающие во второй.


Только может получиться такая лажа:
тег <table> в начале и будет на первой странице, а закрывающий на второй. И так же само с другими.
Поэтому придется закрывать открытые теги на первой странице и открывать на второй.
А это - маразм.
Думаю нужно отказаться от этой идеи и думать, что-то другое.

Спустя 2 дня, 5 минут, 57 секунд (1.11.2007 - 00:02) Deadangel написал(а):
на самом деле перебрал кучу вариантов и при усложнении текста выходят косяки - как и описал kyryll. Получается действительно лажа ... Какие еще предложения будут ?

Спустя 14 дней, 21 час, 12 минут, 33 секунды (15.11.2007 - 21:15) Bahjahkah написал(а):
Цитата
Все теги, кроме <img> придется вырезать. Используй строковую функцию, ну к примеру, замены str_replace. Замени все найденные теги на пустую строку. Потом обрабатывай так, как тебе нужно и выводи в новые таблицы. Но здесь есть минус (вообще в этой системе) - потеряешь красивое форматирование текста, если оно конечно было.

Маразм.

Deadangel
Предложу другой маразм - может стоит попробовать посимвольно пройтись по строке. Заносим все открытые теги в массив (как в виде стека в Ассемблере) и если вывод завершился, а в стеке еще есть данные (не закрытые тэги), то выносим их в обратном направлении (опять же как в Ассемблере) Для облегчения используем функцию foreach() и функцию переворачивания массива.
А в стек заносим все теги имеющие вид <?> в формате </?>, чтобы потом их вывести. Одиночные теги пиши в формате <? /> и делай проверку на слэш в конце тега. Если он есть, в стек его не заносим.

Спустя 2 дня, 1 час, 48 минут, 10 секунд (17.11.2007 - 23:03) kyryll написал(а):
Цитата(Bahjahkah @ 15.11.2007, 18:15) [snapback]29405[/snapback]
Цитата
Все теги, кроме <img> придется вырезать. Используй строковую функцию, ну к примеру, замены str_replace. Замени все найденные теги на пустую строку. Потом обрабатывай так, как тебе нужно и выводи в новые таблицы. Но здесь естьDeadangel этой системе) - потеряешь красивое форматирование текста, если оно конечно было.

Маразм.

[b]Deadangel[/b]
Предложу другой маразм - может стоит попробовать посимвольно пройтись по строке. Заносим все открытые теги в массив (как в виде стека в Ассемблере) и если вывод завершился, а в стеке еще есть данные (не закрытые тэги), то выносим их в обратном направлении (опять же как в Ассемблере) Для облегчения используем функцию foreach() и функцию переворачивания массива.
А в стек заносим все теги имеющие вид <?> в формате </?>, чтобы потом их вывести. Одиночные теги пиши в формате <? /> и делай проверку на слэш в конце тега. Если он есть, в стек его не заносим.


Вот это ты выдал стране угля! blink.gif
Чтобы выдать какой-то рецепт, скажи зачем тебе это вообще нужно. Может можно сделать все гораздо проще. rolleyes.gif

Спустя 18 часов, 5 секунд (18.11.2007 - 17:03) Bahjahkah написал(а):
Цитата
Вот это ты выдал стране угля!
Чтобы выдать какой-то рецепт, скажи зачем тебе это вообще нужно. Может можно сделать все гораздо проще

Если запоминать все незакрытые теги и если вдруг тебе прям на этом вот месте нужно будет закончить текст, то просто выташишь все незакрытые теги и закроешь текст. Или недошло как это работает? Я же специально написал про то, что это очень похоже на стек в Ассемблере.
Могу "на пальцах" объяснить. По-моему тут все очень просто. Прям как у школьников на бейсике. smile.gif

Спустя 22 часа, 10 минут, 31 секунда (19.11.2007 - 15:13) kyryll написал(а):
Цитата(Bahjahkah @ 18.11.2007, 14:03) [snapback]29495[/snapback]
Цитата
Вот это ты выдал стране угля!
Чтобы выдать какой-то рецепт, скажи зачем тебе это вообще нужно. Может можно сделать все гораздо проще

Если запоминать все незакрытые теги и если вдруг тебе прям на этом вот месте нужно будет закончить текст, то просто выташишь все незакрытые теги и закроешь текст. Или недошло как это работает? Я же специально написал про то, что это очень похоже на стек в Ассемблере.
Могу "на пальцах" объяснить. По-моему тут все очень просто. Прям как у школьников на бейсике. smile.gif


До меня-то дошло. Занос в массив это круто. А вот скажи мне, как теги будут выводиться на второй странице? И из какого это интересно массива? И как ты реализуешь логику закрывания и открывания строк и столбцов? Выводом всего, что осталось в массиве? А дальше "гуляй ветер"?!

Спустя 1 день, 8 часов, 31 минута, 46 секунд (20.11.2007 - 23:45) Bahjahkah написал(а):
kyryll
Ну, мозги то есть. Я метод подсказал, развивать надо его дальше. Вы ж не думали, что я за пять минут постинга напишу вам весь готовый листинг на блюдечке. Если сможете найти более лучшую идею, чем я предложил, предлагайте. smile.gif Например, можно разработчикам РНР написать письмо, пусть включат в стандартный набор функций - функцию парсинга тэгов.
Цитата
А вот скажи мне, как теги будут выводиться на второй странице?

Опять же, все незакрытые теги на первой странице, можно запомнить (сессии, куки, БД, благо все эти вещи придуманы до нас smile.gif ) и "открыть" на второй, только не в обратном порядке, а в обычном, сам массив не стираем, т.к. и вторую страницу тоже возможно нужно будет "обрубить"
Цитата
И как ты реализуешь логику закрывания и открывания строк и столбцов?

При обработке тегов внутри <table> запоминаем все что от первого <tr> до </tr>, считаем кол-во <td> в отдельный массив для столбцов, если встречаем <th> смотрим на colspan, вернее то, чему он равен. Если дошли до </table> стираем этот массив, он нам не нужен. Если опять встретим <table> проделываем эту работу вновь.

Очень интуитивно должно получиться. ИМХО.

Спустя 1 день, 18 часов, 21 минута, 59 секунд (22.11.2007 - 18:07) kyryll написал(а):
Ты моледец. Развил идею до целого проекта. wink.gif
Только получается прикол, что между собой общаются люди предлагающие какое-то решение. А тот, кто написал вопрос - молчит, как партизан.
Я так и не услышал от вопрошавшего, зачем нужно именно так выводить ему страницы?

Спустя 1 месяц, 18 дней, 18 часов, 34 минуты, 58 секунд (11.01.2008 - 12:42) mechanic написал(а):
Цитата(kyryll @ 22.11.2007, 18:07) [snapback]29684[/snapback]
Я так и не услышал от вопрошавшего, зачем нужно именно так выводить ему страницы?

похоже уже и не нужно wink.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.