прошу Вас помочь в одной деликатной ситуации. Ситуация такая:
есть некоторый текст из 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() и функцию переворачивания массива.
А в стек заносим все теги имеющие вид <?> в формате </?>, чтобы потом их вывести. Одиночные теги пиши в формате <? /> и делай проверку на слэш в конце тега. Если он есть, в стек его не заносим.
Вот это ты выдал стране угля!
Чтобы выдать какой-то рецепт, скажи зачем тебе это вообще нужно. Может можно сделать все гораздо проще.
Спустя 18 часов, 5 секунд (18.11.2007 - 17:03) Bahjahkah написал(а):
Цитата
Вот это ты выдал стране угля!
Чтобы выдать какой-то рецепт, скажи зачем тебе это вообще нужно. Может можно сделать все гораздо проще
Чтобы выдать какой-то рецепт, скажи зачем тебе это вообще нужно. Может можно сделать все гораздо проще
Если запоминать все незакрытые теги и если вдруг тебе прям на этом вот месте нужно будет закончить текст, то просто выташишь все незакрытые теги и закроешь текст. Или недошло как это работает? Я же специально написал про то, что это очень похоже на стек в Ассемблере.
Могу "на пальцах" объяснить. По-моему тут все очень просто. Прям как у школьников на бейсике.
Спустя 22 часа, 10 минут, 31 секунда (19.11.2007 - 15:13) kyryll написал(а):
Цитата(Bahjahkah @ 18.11.2007, 14:03) [snapback]29495[/snapback]
Цитата
Вот это ты выдал стране угля!
Чтобы выдать какой-то рецепт, скажи зачем тебе это вообще нужно. Может можно сделать все гораздо проще
Чтобы выдать какой-то рецепт, скажи зачем тебе это вообще нужно. Может можно сделать все гораздо проще
Если запоминать все незакрытые теги и если вдруг тебе прям на этом вот месте нужно будет закончить текст, то просто выташишь все незакрытые теги и закроешь текст. Или недошло как это работает? Я же специально написал про то, что это очень похоже на стек в Ассемблере.
Могу "на пальцах" объяснить. По-моему тут все очень просто. Прям как у школьников на бейсике.
До меня-то дошло. Занос в массив это круто. А вот скажи мне, как теги будут выводиться на второй странице? И из какого это интересно массива? И как ты реализуешь логику закрывания и открывания строк и столбцов? Выводом всего, что осталось в массиве? А дальше "гуляй ветер"?!
Спустя 1 день, 8 часов, 31 минута, 46 секунд (20.11.2007 - 23:45) Bahjahkah написал(а):
kyryll
Ну, мозги то есть. Я метод подсказал, развивать надо его дальше. Вы ж не думали, что я за пять минут постинга напишу вам весь готовый листинг на блюдечке. Если сможете найти более лучшую идею, чем я предложил, предлагайте. Например, можно разработчикам РНР написать письмо, пусть включат в стандартный набор функций - функцию парсинга тэгов.
Опять же, все незакрытые теги на первой странице, можно запомнить (сессии, куки, БД, благо все эти вещи придуманы до нас ) и "открыть" на второй, только не в обратном порядке, а в обычном, сам массив не стираем, т.к. и вторую страницу тоже возможно нужно будет "обрубить"
При обработке тегов внутри <table> запоминаем все что от первого <tr> до </tr>, считаем кол-во <td> в отдельный массив для столбцов, если встречаем <th> смотрим на colspan, вернее то, чему он равен. Если дошли до </table> стираем этот массив, он нам не нужен. Если опять встретим <table> проделываем эту работу вновь.
Очень интуитивно должно получиться. ИМХО.
Ну, мозги то есть. Я метод подсказал, развивать надо его дальше. Вы ж не думали, что я за пять минут постинга напишу вам весь готовый листинг на блюдечке. Если сможете найти более лучшую идею, чем я предложил, предлагайте. Например, можно разработчикам РНР написать письмо, пусть включат в стандартный набор функций - функцию парсинга тэгов.
Цитата
А вот скажи мне, как теги будут выводиться на второй странице?
Опять же, все незакрытые теги на первой странице, можно запомнить (сессии, куки, БД, благо все эти вещи придуманы до нас ) и "открыть" на второй, только не в обратном порядке, а в обычном, сам массив не стираем, т.к. и вторую страницу тоже возможно нужно будет "обрубить"
Цитата
И как ты реализуешь логику закрывания и открывания строк и столбцов?
При обработке тегов внутри <table> запоминаем все что от первого <tr> до </tr>, считаем кол-во <td> в отдельный массив для столбцов, если встречаем <th> смотрим на colspan, вернее то, чему он равен. Если дошли до </table> стираем этот массив, он нам не нужен. Если опять встретим <table> проделываем эту работу вновь.
Очень интуитивно должно получиться. ИМХО.
Спустя 1 день, 18 часов, 21 минута, 59 секунд (22.11.2007 - 18:07) kyryll написал(а):
Ты моледец. Развил идею до целого проекта.
Только получается прикол, что между собой общаются люди предлагающие какое-то решение. А тот, кто написал вопрос - молчит, как партизан.
Я так и не услышал от вопрошавшего, зачем нужно именно так выводить ему страницы?
Только получается прикол, что между собой общаются люди предлагающие какое-то решение. А тот, кто написал вопрос - молчит, как партизан.
Я так и не услышал от вопрошавшего, зачем нужно именно так выводить ему страницы?
Спустя 1 месяц, 18 дней, 18 часов, 34 минуты, 58 секунд (11.01.2008 - 12:42) mechanic написал(а):
Цитата(kyryll @ 22.11.2007, 18:07) [snapback]29684[/snapback]
Я так и не услышал от вопрошавшего, зачем нужно именно так выводить ему страницы?
похоже уже и не нужно